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。

所以我然后将这些匿名类型解析Tag 对象:

groups.OrderByDescending(g => g.Frequency).Take(25).ToList().ForEach(t => tags.Add(new Tag()
{
    Tag = t.Tag,
    Frequency = t.Frequency
}));

我是 LINQ 新手,这似乎不对。请告诉我它是如何真正完成的。

4

4 回答 4

25

如果你想要 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);
于 2008-10-30T16:53:14.193 回答
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();
于 2008-10-30T18:21:55.717 回答
10

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

于 2008-10-30T16:51:57.660 回答
3

我认为您的 SQL 查询与您的 LINQ 查询做的事情不同,这也是不公平的——它没有返回前 25 个。

于 2010-05-20T20:18:32.257 回答