检查分组集中的列是否包含除第一行以外的相同值

时间:2013-04-01 18:20:04

标签: asp.net-mvc linq entity-framework linq-to-sql

我正在处理一个相当大的查询,但我现在停留在最后一点。给出这个示例表:

  Key1  |  Key2  |  SomeCol  |
    0   |    0   |    ABC    |
    0   |    1   |    123    |
------------------------------
    1   |    5   |    ABC    |
    1   |    6   |    DEF    |
    1   |    7   |    ABC    |
------------------------------
    2   |    4   |    ABC    |
    2   |    5   |    456    |
    2   |    6   |    456    |
------------------------------
    3   |    4   |    ABC    |
    3   |    5   |    456    |
    3   |    6   |    ABC    |
------------------------------
    4   |    4   |    ABC    |
    4   |    5   |    ABC    |
    4   |    6   |    ABC    |

在我的查询中,我已经提取了表的顺序(Key1,Key2)部分并按Key1分组。我希望确定SomeCol的所有值是否相同,除了第一行。

Expected results:
  Key1  |  Key2  |  SomeCol  |
    0   |    0   |    ABC    |
    2   |    4   |    ABC    |
    4   |    4   |    ABC    |

我知道在我需要所有条目相同的情况下我可以使用类似.Any(g => g.SomeCol.Distinct().Count() == 1)的内容,但我似乎无法弄清楚如何将语法正确地引用到Skip(1)。另外,我觉得我检查平等的方法有点像黑客。我知道我可以在C#中轻松完成这个处理,但我想在数据库端获得尽可能多的处理。由于我的查询目前是用扩展方法编写的,我将在同一语法中给予答案。谢谢!

到目前为止我所拥有的:

resultFromRestOfQuery
.GroupBy(g => g.Key1)
????
.SelectMany(g => g.Take(1).Select(h => h)

1 个答案:

答案 0 :(得分:1)

<强>更新

好吧,在您的价值观上对此进行了测试,并确实有效。

var result = collection
            .OrderBy(p => p.Key1)
            .ThenBy(p => p.Key2)
            .GroupBy(p => p.Key1)
            .Where(p => p.Skip(1)
                    .Select(j => j.SomeCol)
                    .Distinct().Count() == 1)
            .Select(p => p.First())
            .ToList();

更新#2

也许这会对你的表现有所帮助。以下是此查询的另一个版本,未使用Distinct()。注意p.Count() > 1 - 这是为了避免在组中只有1个元素时选择组中的第1行。如果只有一行可以选择第一行,只需删除这部分条件。

 var result = collection
            .OrderBy(p => p.Key1)
            .ThenBy(p => p.Key2)
            .GroupBy(p => p.Key1)
            .Where(p => p.Count() > 1 && p.Skip(1)
                    .Select(j => j.SomeCol)
                    .All(j => j == p.Last().SomeCol))
            .Select(p => p.First())
            .ToList();