考虑这段代码:
var query = from groupRole in CurrentItem.MEMGroupRoles
select groupRole.MEMRole;
this.AvailableRoles = this.allRoles.Except(query.AsEnumerable()).ToList();
在这段代码中,除了 CurrentItem 已有的那些角色外,我采用了所有角色。 2 个问题:
- 它不起作用,因为我在对象上进行比较,而这些对象是不同的实例
- 我不喜欢 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.MEMGroupRoles 包含 MEMGroupRole 对象列表,每个 MEMGroupRole 包含 MEMRole 内部
我想选择 allRoles 中的所有 MEMRole 对象,除了那些埋藏在 CurrentItem 中的 MEMRoles。第一个代码片段可以工作,但我需要通过 MEMRole.RoleId 比较 MEMRole 和 MEMRole,因为它们是同一数据库实体的不同实例。
最佳答案
你可以覆盖 Equals()
和 GetHashCode()
如果角色对象是这样的,那么用角色 ID 来标识它是有意义的。如果不是这种情况,您可以创建一个实现 IEqualityComparer<>
的角色比较器类. Except()
将相等比较器作为第二个参数。
这是一个创建角色 ID 查找并使用它来过滤角色的解决方案。不过,我确实认为上述替代方案是解决您问题的更好方法。
var lookup = CurrentItem.MEMGroupRoles
.ToLookup(groupRole => groupRole.MEMRole.RoleId);
this.AvailableRoles = this.allRoles
.Where(role => !lookup.Contains(role.RoleId))
.ToList();
关于c# - 如何将此 LINQ 查询编写为单个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7826230/