我想了解我GROUP BY
在Linq中的查询做错了什么。我已经尝试了许多示例(即Linq与具有count的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();
这给出了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字段-Syntax help,这也对我有用。但是,我将获得带有Var1,Var2,Var3和Count的对象列表。在此列表中,我只想将Count大于1的对象的Var3。
谁能指出我正确的方向?
编辑1:正如我在引言中所说的,Linq与group by的问题通过计数无法解决我的问题。如果使用此代码,则仍然有一组229个结果,而不是实际“重复”的27个结果(意味着,该组的计数大于1)。
编辑3:目前,我正在使用以下内容。我需要两个语句,我认为这很奇怪,但是如前所述,这似乎是仅选择count> 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并将其存储在SomeClass()中,而不是仅选择Var3。这只是一个附加,选择所有内容都无助于创建1条语句来获得此选择。
编辑4:我当然可以.Where..
将duplicates
变量的一部分添加到querygroup
语句中,从而形成一个完整的语句。成功?似乎过分杀伤,但至少它能起作用。
如果有人能找到为什么我需要2条陈述,请详细说明:)
所以,我的问题的答案:
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();
似乎有点矫kill过正,我觉得它可能会更小,所以如果有人愿意对此发表评论...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句