0

我正在处理一个相当大的查询,但现在卡在最后一点。鉴于此示例表:

  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). 另外,我觉得我检查相等性的方法有点像 hack。我知道我可以在 C# 中轻松完成此处理,但我希望在数据库端进行尽可能多的处理。由于我的查询目前是用扩展方法编写的,因此我希望以相同的语法回答。谢谢!

到目前为止我所拥有的:

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

1 回答 1

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 个元素时选择组中的第一行。如果在只有一行的情况下可以选择第一行,只需删除这部分条件即可。

 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();
于 2013-04-01T18:32:07.440 回答