Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将此LINQ查询编写为单个查询?_C#_Linq - Fatal编程技术网

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.MEMGroupRoles包含MEMGroupRole对象列表,每个MEMGroupRole中都包含MEMRole

  • 我想选择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,这可能有助于您诊断问题。

    您能用英语写下您想要完成的任务吗?我不清楚你的密码。你应该专注于工作代码。在普通代码中,拥有最少的行数并不是您应该追求的目标。