Dot-Net
LINQ 中“最受歡迎”的 GROUP BY?
假設有一個標籤表,如 stackoverflow 問題標籤:
TagID (bigint), QuestionID (bigint), Tag (varchar)
使用 LINQ 獲取 25 個最常用標籤的最有效方法是什麼?在 SQL 中,一個簡單的 GROUP BY 就可以:
SELECT Tag, COUNT(Tag) FROM Tags GROUP BY Tag我寫了一些有效的 LINQ:
var groups = from t in DataContext.Tags group t by t.Tag into g select new { Tag = g.Key, Frequency = g.Count() }; return groups.OrderByDescending(g => g.Frequency).Take(25);像,真的嗎?這不是超級冗長嗎?可悲的是,我這樣做是為了保存大量查詢,因為我的 Tag 對像已經包含一個 Frequency 屬性,否則如果我實際使用該屬性,則需要用數據庫檢查每個 Tag。
所以我然後將這些匿名類型解析回Tag 對象:
groups.OrderByDescending(g => g.Frequency).Take(25).ToList().ForEach(t => tags.Add(new Tag() { Tag = t.Tag, Frequency = t.Frequency }));我是 LINQ 新手,這似乎不對。請告訴我它是如何真正完成的。
我很確定你做對了。而且,LINQ 生成並將發送到您的數據庫的 SQL 看起來就像您開始使用的 SQL,所以當您進行更多的輸入時,您的數據庫並沒有做更多的工作。
如果你想要 Tag 對象,為什麼不直接從你的 Linq 查詢中創建它們呢?
var groups = from t in DataContext.Tags group t by t.Tag into g select new Tag() { Tag = g.Key, Frequency = g.Count() }; return groups.OrderByDescending(g => g.Frequency).Take(25);