簡體   English   中英

LINQ with GROUP BY和HAVING COUNT

[英]LINQ with GROUP BY and HAVING COUNT

我想了解我在Linq的GROUP BY查詢中做錯了什么。 我已經嘗試了很多例子(例如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();

這給出了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幫助 ,這對我也有用 但是,我將獲得Var1,Var2,Var3和Count的對象列表。 在這個列表中,我只想要Count3大於1的Var3。

誰可以指出我正確的方向?

編輯1:正如我在我的介紹中所說, Linq與群體一起計算的問題並沒有回答我的問題。 如果我使用這個代碼,我仍然有一組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,而不是僅選擇Var3,並將它們存儲在SomeClass()中。 這只是一個補充,選擇所有內容並沒有幫助創建1個語句來獲得此選擇。

編輯4:我可以在duplicates變量中使用.Where..部分並將其添加到querygroup語句中,從而創建整個語句。 成功? 似乎矯枉過正,但至少它有效。

如果有人能找出我需要2個陳述的原因,請詳細說明:)

試試這個

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();

你可以在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查看您的查詢對您的數據做了什么。

那么,我的問題的答案:

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();

似乎有點矯枉過正,我覺得它可能更小,所以如果有人喜歡對此發表評論......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM