webdevqa.jp.net

「最も人気のある」GROUP BY LINQで?

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プロパティが含まれているため、実際にこのプロパティを使用する場合は、タグごとにデータベースを確認する必要があるため、大量のクエリを保存するためにこれを行っています。

したがって、これらの匿名型backを解析してTagオブジェクトに変換します。

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

私はLINQ初心者ですが、これは正しくないようです。実際にどのように行われているかを見せてください。

30
tags2k

私はあなたが正しく理解していると確信しています。そして、LINQが生成し、dbに送信するSQLは、最初のSQLのように見えるので、もう少しタイピングしている間、データベースはそれ以上の作業を行いません。

10
James Curran

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

構文の冗長形式を使用すると、コードは冗長になります。ここに代替があります:

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();
12
Amy B

SQLクエリがLINQクエリと同じことをしないという点でも不公平だと思います。上位25を返しません。

3
NetMage