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查询吗: