【问题标题】:"Most popular" GROUP BY in LINQ?LINQ 中“最受欢迎”的 GROUP BY?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 此外,我收到“不允许在查询中显式构造实体类型”错误。好像不行!
  • 我怀疑这是因为 Tag 是一种数据上下文类型 - 您绝对可以对其他类型执行此操作,但 Linq 显然试图保护您不创建与数据上下文项不对应的 Tag 实例。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 毫无疑问,这是 SQL 中最难的部分,完全被忽略了。
      猜你喜欢
      • 2021-10-18
      • 2021-02-20
      • 1970-01-01
      • 2022-01-22
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 2012-03-24
      相关资源
      最近更新 更多