c# - 如何将此 LINQ 查询编写为单个查询?

标签 c# linq

考虑这段代码:

var query = from groupRole in CurrentItem.MEMGroupRoles 
            select groupRole.MEMRole;
this.AvailableRoles = this.allRoles.Except(query.AsEnumerable()).ToList();

在这段代码中,除了 CurrentItem 已有的那些角色外,我采用了所有角色。 2 个问题:

  1. 它不起作用,因为我在对象上进行比较,而这些对象是不同的实例
  2. 我不喜欢 2 行,喜欢改进。

这是我现在真正需要做的伪代码:

var queryIds = from groupRole in CurrentItem.MEMGroupRoles 
               select groupRole.MEMRole.RoleId;
this.AvailableRoles = this.allRoles.Except(where RoleId query.AsEnumerable()).ToList();

如何编写这样的查询?

编辑:

解释:

  1. allRoles 包含 MEMRole 对象列表
  2. 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/

相关文章:

c# - 旋转外部 N x N 方阵,同时保持内部方阵不变

c# - 如何在 Property Trigger 触发时设置 viewmodel 属性

c# - Entity Framework 重用连接

c# - 实例化 RoleManager 以将角色添加到数据库时出错

C#:合并数据表中的数据行

c# - SonarQube - C# 代码未显示在仪表板上

c# - sqlite查询慢,如何优化(使用linq to entities)

c# - LINQ - 将组转换为数组

vb.net - 如何使用Linq ToDictionary返回字典项中具有多个值的字典?

c# - 将 C# MongoDB LINQ 与鉴别器一起使用