Yeo*_*nho 14 linq linq-to-entities entity-framework wcf-ria-services
我有实体Group和User.
该Group实体拥有Users财产是用户的列表.
用户有一个名为的属性IsEnabled.
我想编写一个返回Groups 列表的linq查询,该列表只包含Users IsEnabled为true 的s .
例如,对于类似下面的数据,
AllGroups
组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)
});
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助!
Yak*_*ych 15
这样做没有"好"的方法,但你可以试试这个 - 同时进行项目,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();
Run Code Online (Sandbox Code Playgroud)
这不是一个记录的功能,而是与EF构造SQL查询的方式有关 - 在这种情况下,它应该过滤掉子集合,因此您的FilteredGroups列表将只包含活动用户.
如果这样可行,您可以尝试合并代码:
FilteredGroups = AllGroups.
Select(g => new
{
GroupItem = g,
UserItems = g.Users.Where(u => !u.IsInactive)
}).
Select(r => r.GroupItem).
ToList();
Run Code Online (Sandbox Code Playgroud)
(这是未经测试的,结果取决于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()
Run Code Online (Sandbox Code Playgroud)
通过使用ToList(),您可以强制执行到数据库的往返,因为否则延迟执行会妨碍.第二个查询仅重新排序检索到的数据.
注意:之后您可能无法更新您的实体!
| 归档时间: |
|
| 查看次数: |
21469 次 |
| 最近记录: |