Linq To Entities - 如何过滤子实体

2023-12-22

我有实体Group and User.
the Group实体有Users属性是用户列表。
用户有一个名为IsEnabled.

我想编写一个返回列表的 linq 查询Groups,仅包含Users whose IsEnabled是真的。

例如,对于如下数据
AllGroups
Group A
用户 1(IsEnabled = true)
用户 2(IsEnabled = true)
用户 3(IsEnabled = false)

Group B
用户 4(IsEnabled = true)
用户 5(IsEnabled = false)
用户 6(IsEnabled = false)

我想要得到
FilteredGroups
Group A
用户 1(IsEnabled = true)
用户 2(IsEnabled = true)

Group B
用户 4(IsEnabled = true)

我尝试了以下查询,但 Visual Studio 告诉我
[无法分配属性或索引器“用户”——它是只读的]

FilteredGroups = AllGroups.Select(g => new Group()
                    {
                        ID = g.ID,
                        Name = g.Name,
                        ...
                        Users = g.Users.Where(u => u.IsInactive == false)
                    });

感谢您的帮助!


没有“好的”方法可以做到这一点,但你可以尝试这个 - 项目两者,Group并过滤Users到一个匿名对象上,然后Select只是Groups:

var resultObjectList = AllGroups.
                       Select(g => new
                               {
                                   GroupItem = g,
                                   UserItems = g.Users.Where(u => !u.IsInactive)
                               }).ToList();

FilteredGroups = resultObjectList.Select(i => i.GroupItem).ToList();

这不是一个记录在案的功能,并且与 EF 构造 SQL 查询的方式有关 - 在这种情况下,它应该过滤掉子集合,因此您的FilteredGroups列表将仅包含活跃用户。

如果这有效,您可以尝试合并代码:

FilteredGroups = AllGroups.
                 Select(g => new
                               {
                                   GroupItem = g,
                                   UserItems = g.Users.Where(u => !u.IsInactive)
                               }).
                 Select(r => r.GroupItem).
                 ToList();

(这未经测试,结果取决于 EF 将如何处理第二个Select,所以如果您在尝试后让我们知道哪种方法有效,那就太好了)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linq To Entities - 如何过滤子实体 的相关文章