当前位置:  开发笔记 > 数据库 > 正文

LINQ中"最受欢迎的"GROUP BY?

如何解决《LINQ中"最受欢迎的"GROUPBY?》经验,为你挑选了3个好方法。

假设有一个像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新手,这似乎不对.请告诉我它是如何完成的.



1> GalacticCowb..:

如果您想要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);



2> Amy B..:

如果您使用详细的语法形式,您的代码将是详细的.这是另一种选择:

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



3> James Curran..:

我很确定你做对了.而且,LINQ生成并将发送到您的数据库的SQL看起来就像您开始使用的SQL,所以当您进行更多的输入时,您的数据库不再做任何工作.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有