【发布时间】:2010-09-20 00:50:30
【问题描述】:
假设有一个标签表,如 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。
然后我将这些匿名类型 back 解析为 Tag 对象:
groups.OrderByDescending(g => g.Frequency).Take(25).ToList().ForEach(t => tags.Add(new Tag()
{
Tag = t.Tag,
Frequency = t.Frequency
}));
我是 LINQ 新手,这似乎不对。请告诉我它是如何完成的。
【问题讨论】:
-
我相信你的 SQL 应该是
SELECT Tag, COUNT(Tag) FROM Tags GROUP BY Tag ORDER BY COUNT(Tag) DESC FETCH FIRST 25 ROWS ONLY这不会让 Linq 看起来那么糟糕。
标签: .net linq group-by ranking