我正在处理一个相当大的查询,但我现在停留在最后一点。给出这个示例表:
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)
答案 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();