C# 如何将此LINQ查询编写为单个查询?
考虑以下代码:C# 如何将此LINQ查询编写为单个查询?,c#,linq,C#,Linq,考虑以下代码: var query = from groupRole in CurrentItem.MEMGroupRoles select groupRole.MEMRole; this.AvailableRoles = this.allRoles.Except(query.AsEnumerable()).ToList(); 在这段代码中,除了CurrentItem已经拥有的角色之外,我接受所有角色。2个问题: 它不起作用,因为我比较对象,而这些对象是不同的实例 我
var query = from groupRole in CurrentItem.MEMGroupRoles
select groupRole.MEMRole;
this.AvailableRoles = this.allRoles.Except(query.AsEnumerable()).ToList();
在这段代码中,除了CurrentItem已经拥有的角色之外,我接受所有角色。2个问题:
var queryIds = from groupRole in CurrentItem.MEMGroupRoles
select groupRole.MEMRole.RoleId;
this.AvailableRoles = this.allRoles.Except(where RoleId query.AsEnumerable()).ToList();
如何编写这样的查询
编辑:
说明:
我想选择allRoles中的所有MEMRole对象,但CurrentItem中隐藏的MEMRoles除外。第一个代码片段可以工作,但我需要通过MEMRole.RoleId将MEMRole与MEMRole进行比较,因为它是同一数据库实体的不同实例。如果role对象使用role id标识它是有意义的,则可以覆盖
Equals()
和GetHashCode()
。如果不是这样,您可以创建一个实现IEqualityComparer
的角色比较器类Except()
将相等比较器作为第二个参数
下面是一个为角色ID创建查找并使用它筛选角色的解决方案。然而,我确实认为上述备选方案是解决您问题的更好办法
var lookup = CurrentItem.MEMGroupRoles
.ToLookup(groupRole => groupRole.MEMRole.RoleId);
this.AvailableRoles = this.allRoles
.Where(role => !lookup.Contains(role.RoleId))
.ToList();
按照你建议的方法:
var ids = CurrentItem.MEMGroupRoles.Select(g => g.MMERole.RoleId);
this.AvailableRoles = this.allRoles.Where(r => ids.All(i => i != r.RoleId));
或者(尽管我不会这样做),如果您必须有一个查询,您可以附加两个角色集合(当前和所有),按RoleId
对它们进行分组,并选择只有一个成员的组:
this.AvailableRoles = CurrentItem.MEMGroupRoles
.Select(g => g.MEMRole)
.Concat(this.allRoles)
.GroupBy(r => r.RoleId)
.Where(g => g.Count() == 1)
.Select(g => g.First());
这会导致角色不在CurrentItem.MEMGroupRoles
集合中。但再一次,它只是。。。对于体育:)这是SQL的LINQ吗
如果是,请使用
DataContext.Log
属性查看传递到数据库的实际SQL,这可能有助于您诊断问题。您能用英语写下您想要完成的任务吗?我不清楚你的密码。你应该专注于工作代码。在普通代码中,拥有最少的行数并不是您应该追求的目标。