Linq到实体-如何筛选子实体

Linq到实体-如何筛选子实体,linq,entity-framework,linq-to-entities,wcf-ria-services,Linq,Entity Framework,Linq To Entities,Wcf Ria Services,我有实体组和用户 组实体具有作为用户列表的用户属性。 用户有一个名为IsEnabled的属性 我想编写一个linq查询,返回组s的列表,该列表只包含用户s,其已启用为true 例如,对于以下数据 所有组 A组 用户1(IsEnabled=true) 用户2(IsEnabled=true) 用户3(IsEnabled=false) B组 用户4(IsEnabled=true) 用户5(IsEnabled=false) 用户6(IsEnabled=false) 我想得到 FilteredGroups

我有实体
用户

实体具有作为用户列表的
用户
属性。
用户有一个名为
IsEnabled
的属性

我想编写一个linq查询,返回
s的列表,该列表只包含
用户
s,其
已启用
为true

例如,对于以下数据
所有组

A组
用户1(IsEnabled=true)
用户2(IsEnabled=true)
用户3(IsEnabled=false)

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

我想得到
FilteredGroups

A组
用户1(IsEnabled=true)
用户2(IsEnabled=true)

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)
                    });
谢谢你的帮助

没有“好”的方法可以做到这一点,但您可以尝试这样做-将
和过滤的
用户
投影到一个匿名对象上,然后
只选择

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
,因此,如果您在尝试后让我们知道哪种方法有效,那就太好了)。

我通过颠倒查询来实现这一点:

var users = (from user in Users.Include("Group")
             where user.IsEnabled
             select user).ToList().AsQueryable()

from (user in users
      select user.Group).Distinct()
通过使用ToList()命令,您可以强制执行到数据库的往返,这是必需的,因为否则延迟的执行会妨碍执行。第二个查询仅对检索到的数据重新排序


注意:以后可能无法对实体进行udpate

尝试类似的方法,您仍将拥有您的实体:

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

这样,您仍然可以使用
组。用户

如果要保留实体结构,请尝试以下操作:

var userGroups = context.Users.Where(u => !u.IsInactive).GroupBy(u => u.Group);

foreach (var userGroup in userGroups)
{
    // Do group stuff, e.g.:
    foreach (var user in userGroup)
    {
    }
}
您当然可以修改您的实体

使用内部linq查询

var FilteredGroups = (from g in AllGroups
                      select new Group()
                        {
                            ID = g.ID,
                            Name = g.Name,
                            ...
                            Users = (from user in g.Users
                                     where user.IsInactive == false
                                     select user).ToList()
                        });

你在用EF4吗?如果是,您是否使用POCO?
Group.Users
是如何声明的?您可以通过过滤的Include轻松实现这一点。投票支持该功能!您能帮我解决这个linq查询吗: