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

本当に?これは非常に冗長ではありませんか?悲しいことに、大量のクエリを節約するためにこれを行っていることです。実際にプロパティを使用した場合、タグ オブジェクトごとにデータベースで確認する必要がある Frequency プロパティが既に含まれているためです。

そこで、これらの匿名型を解析して 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 に答える