gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:09 24 4
gpt4 key购买 nike

考虑这段代码:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com