LINQ with GROUP BY和HAVING COUNT

时间:2016-04-04 08:49:08

标签: c# linq sql-server-2008 group-by linq-expressions

我想了解我在Linq中的GROUP BY查询错误。我尝试了很多例子(例如Linq with group by having count),但我仍然获得了更多结果(因为跳过了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();

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

SELECT Var3
FROM myTable
GROUP BY Var1, Var2, Var3
HAVING COUNT(*) > 1

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

.Select(g => new { Item = g.Key, Count = g.Count() })

但我不想要一个包含项目(和计数)的列表并且必须浏览该列表,我希望HAVING部分能够在Linq表达式中运行...

编辑2:如果你看一下LINQ Group By Multiple fields -Syntax help,这对我也有用。但是,我将获得Var1,Var2,Var3和Count的对象列表。在这个列表中,我只想要计数大于1的对象的Var3。

任何可以指引我朝正确方向前进的人?

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

编辑3:此时我正在使用以下内容。我需要两个陈述,我认为这很奇怪,但如前所述,这似乎是仅选择具有计数&gt;的记录的唯一方法。 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();

请注意,我决定选择值Var1和Var2,而不是仅选择Var3,并将它们存储在SomeClass()中。这只是一个补充,选择一切并没有帮助创建1个语句来获得这个选择。

编辑4:我可以在.Where..变量中取duplicates部分并将其添加到querygroup语句中,从而制作整个声明。成功?似乎矫枉过正,但至少它有效。

如果有人能找出我需要2个陈述的原因,请详细说明:)

3 个答案:

答案 0 :(得分:1)

试试这个

var test = session.Query<SomeClass>()
                  .GroupBy(c => new { c.Var1, c.Var2, c.Var3 })
                  .Select(d=> new { var1 = d.Key.var1,var2 = d.Key.var2,var3=d.Key.var3,records = d.ToList()})
                  .Where(e => e.records.Count() > 1)
                  .Select(g => g.Var3)
                  .ToList();

答案 1 :(得分:0)

您可以在Linqpad中尝试此操作。我更改了查询的表和列名称以匹配我自己的数据库:

Levels
.GroupBy(c => new { c.CourseGuid, c.ModuleName })
.Where(g => g.Count() > 10)
.Select(g => g.Key.CourseGuid)

这是它产生的SQL查询:

-- Region Parameters
DECLARE @p0 Int = 10
-- EndRegion
SELECT [t1].[CourseGuid]
FROM (
    SELECT COUNT(*) AS [value], [t0].[CourseGuid]
    FROM [xrt].[Levels] AS [t0]
    GROUP BY [t0].[CourseGuid], [t0].[ModuleName]
    ) AS [t1]
WHERE [t1].[value] > @p0

不是HAVING COUNT而是WHERE而且功能相同。使用@ p0参数显示输出已正确过滤。

我建议您尝试使用Linqpad查看您的查询对您的数据做了什么。

答案 2 :(得分: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();

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

相关问题