“最も人気のある” LINQのGROUP BY?
質問
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を返しません。
所属していません StackOverflow