tag*_*s2k 30 .net linq group-by ranking
假设有一个像stackoverflow问题标签的标签表:
TagID(bigint),QuestionID(bigint),Tag(varchar)
使用LINQ获取25个最常用标签的最有效方法是什么?在SQL中,一个简单的GROUP BY将:
SELECT Tag, COUNT(Tag) FROM Tags GROUP BY Tag
Run Code Online (Sandbox Code Playgroud)
我写了一些有效的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);
Run Code Online (Sandbox Code Playgroud)
喜欢,真的吗?这不是很啰嗦吗?可悲的是,我这样做是为了保存大量的查询,因为我的Tag对象已经包含一个Frequency属性,否则如果我实际使用了该属性,则需要使用数据库检查每个Tag.
然后我将这些匿名类型解析回 Tag对象:
groups.OrderByDescending(g => g.Frequency).Take(25).ToList().ForEach(t => tags.Add(new Tag()
{
Tag = t.Tag,
Frequency = t.Frequency
}));
Run Code Online (Sandbox Code Playgroud)
我是LINQ新手,这似乎不对.请告诉我它是如何完成的.
Gal*_*boy 24
如果您想要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);
Run Code Online (Sandbox Code Playgroud)
Amy*_*y B 12
如果您使用详细的语法形式,您的代码将是详细的.这是另一种选择:
List<Tag> result =
db.Tags
.GroupBy(t => t.Tag)
.Select(g => new {Tag = g.Key, Frequency = g.Count()})
.OrderByDescending(t => t.Frequency)
.Take(25)
.ToList()
.Select(t => new Tag(){Tag = t.Tag, Frequency = t.Frequency})
.ToList();
Run Code Online (Sandbox Code Playgroud)