代码之家  ›  专栏  ›  技术社区  ›  tags2k

“最受欢迎”的一组在林肯?

  •  30
  • tags2k  · 技术社区  · 17 年前

    假设一个标签表,如stackoverflow问题标签:

    tagid(bigint)、questionid(bigint)、tag(varchar)

    使用LINQ获得25个最常用标签的最有效方法是什么?在SQL中,一个简单的分组方式可以做到:

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

    真的吗?这不是很冗长吗?可悲的是,我这样做是为了保存大量的查询,因为我的标记对象已经包含了一个frequency属性,否则如果我实际使用了这个属性,就需要与数据库核对每个标记。

    然后我分析这些匿名类型 后面 到标记对象:

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

    我是个新手,但这似乎不太对劲。请告诉我怎么做。

    4 回复  |  直到 8 年前
        1
  •  10
  •   James Curran    17 年前

    我很确定你说得对。而且,Linq生成的并将发送到数据库的SQL看起来就像是您开始使用的SQL,因此,当您键入更多内容时,数据库将不再做任何工作。

        2
  •  24
  •   GalacticCowboy    17 年前

    如果需要标记对象,为什么不直接从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);
    
        3
  •  12
  •   Amy B    17 年前

    如果您使用冗长的语法形式,您的代码将是冗长的。还有一种选择:

    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();
    
        4
  •  3
  •   NetMage    16 年前

    我认为你也不公平,因为你的SQL查询和你的LINQ查询不一样——它没有返回前25位。

    推荐文章