質問

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プロパティが含まれているため、クエリを大量に保存するためにこれを実行していることです。 >

したがって、これらの匿名タイプを解析して back タグオブジェクトにします:

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

私はLINQ初心者です。これは正しくないようです。それが実際にどのように行われたかを教えてください。

役に立ちましたか?

解決

あなたはそれが正しいと確信しています。また、LINQが生成してdbに送信するSQLは、最初に使用したSQLのように見えるため、もう少し入力している間は、データベースはそれ以上作業していません。

他のヒント

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

構文の冗長形式を使用すると、コードは冗長になります。代替手段は次のとおりです。

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

また、SQLクエリはLINQクエリと同じことをしないという点で不公平だと思います-トップ25を返しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top