我希望了解我的 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() })
但我不想要一个带有项目(和计数)的列表,并且必须遍历该列表,我希望在Linq表达式中使
HAVING
部分起作用...编辑2:如果您查看LINQ Group By Multiple fields -Syntax help,这对我也有效。 但是,我将获得具有Var1、Var2、Var3和Count的对象列表。 在此列表中,我只想要具有Count大于1的对象的Var3。
有谁能指点我正确的方向吗?
编辑1:正如我在介绍中所说,问题Linq with group by having 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();
请注意,我决定选择Var1和Var2的值,并将它们存储在SomeClass()中,而不是仅选择Var3。这只是一个补充,选择所有内容并不能帮助创建一个语句来获取此选择。
编辑4:当然,我可以将
duplicates
变量中的.Where..
部分添加到querygroup
语句中,从而使整个语句成为一个。成功了吗?似乎有点过度设计,但至少它能工作。如果有人能找出我为什么需要两个语句,请详细说明 :)
var testA = session.Query<SomeClass>().GroupBy(c => new { c.Var1, c.Var2, c.Var3 }).ToList(); var test = testA.Where(g => g.Count() > 1).Select(g => g.Key.Var3).ToList();
,并查看结果。 - Ivan StoevToList()
替换为ToString()
。你看到了类似 SQL 的东西吗? - Ivan Stoev