带有 GROUP BY 和 HAVING COUNT 的 LINQ

Tja*_*jab 6 c# linq group-by sql-server-2008 linq-expressions

我想了解我GROUP BY在 Linq 中的查询做错了什么。我已经尝试了许多示例(即通过 count 将 Linq 与 group 一起使用),但我仍然得到更多结果(因为WHERE跳过了)。我的代码是这样的:

var test = session.Query<SomeClass>()
                  .GroupBy(c => new { c.Var1, c.Var2, c.Var3 })
                  .Where(g => g.Count() > 1)
                  .Select(g => g.Key.Var3)
                  .ToList();
Run Code Online (Sandbox Code Playgroud)

这给出了 229 个结果(所有记录)。我想在 Linq 中构建的查询是:

SELECT Var3
FROM myTable
GROUP BY Var1, Var2, Var3
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)

不知何故,查询给了我 27 个结果,但 Linq 表达式给了我 229 个(全部)。当我将 Linq 表达式的 where/select 部分替换为以下内容时,我确实得到了一个计数为 2 或更高的列表:

.Select(g => new { Item = g.Key, Count = g.Count() })
Run Code Online (Sandbox Code Playgroud)

但我不想要一个包含项目(和计数)的列表并且不得不浏览该列表,我想让HAVING部分在 Linq 表达式中工作......

编辑 2:如果您查看LINQ Group By Multiple fields -Syntax help,这也适用于我。但是,我会得到一个包含 Var1、Var2、Var3 和 Count 的对象列表。在这个列表中,我只想对计数大于 1 的对象进行 Var3。

谁能指出我正确的方向?

编辑 1:正如我在介绍中所说,Linq with group by has count问题没有回答我的问题。如果我使用此代码,我仍然有一组 229 个结果,而不是实际“重复”的 27 个结果(意思是,在计数超过 1 的组之后)。

编辑 3:此时我正在使用以下内容。我需要两个语句,我认为这很奇怪,但如前所述,这似乎是仅选择计数 > 1 的记录的唯一方法。

var querygroup = session.Query<SomeClass>()
                        .GroupBy(e => new { e.Var1, e.Var2, e.Var3 })
                        .Select(s => new { s.Key.Var1, s.Key.Var2, s.Key.Var3, Count = s.Count() })
                        .ToList();

var duplicates = querygroup.Where(g => g.Count > 1)
                           .Select(g => new SomeClass() { Var1 = g.Var1, Var2 = g.Var2, Var3 = g.Var3})
                           .ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,不是只选择 Var3,我决定同时选择值 Var1 和 Var2 并将它们存储在 SomeClass() 中。这只是一个补充,选择所有内容无助于创建 1 条语句来获得此选择。

编辑 4:我当然可以.Where..将duplicates变量中的一部分添加到querygroup语句中,从而构成整个语句。成功?似乎矫枉过正,但至少它有效。

如果有人能找出为什么我需要 2 个语句,请详细说明 :)

Tja*_*jab 0

那么,我的问题的答案:

var duplicates = session.Query<SomeClass>()
                        .GroupBy(e => new { e.Var1, e.Var2, e.Var3 })
                        .Select(s => new { s.Key.Var1, s.Key.Var2, s.Key.Var3, Count = s.Count() })
                        .ToList()
                        .Where(g => g.Count > 1)
                        .Select(g => new SomeClass() { Var1 = g.Var1, Var2 = g.Var2, Var3 = g.Var3})
                        .ToList();
Run Code Online (Sandbox Code Playgroud)

似乎有点矫枉过正,我觉得它可以更小,所以如果有人愿意对此发表评论......