0

主な目的は、人気度に従って並べ替えられた順序で成分のリストを返すことです (これは、特定の成分をお気に入りとして持っている人の数によって示されます)。同等の SQL は次のとおりです。

select distinct COUNT(PersonalInfoes.FavoriteIngredient_ID) as NoUsing, 
Ingredients.Name 
from PersonalInfoes  right join Ingredients
on PersonalInfoes.FavoriteIngredient_ID = Ingredients.ID
group by Ingredients.Name
order by NoUsing desc

上記と同じ結果を生成するメソッド構文の同等の SQL クエリは何ですか? 私が持っている最も近いものはこれです:

from i in db.Ingredients 
join p in db.PersonalInfos on i.ID equals p.FavoriteIngredient.ID into ing
from p in ing.DefaultIfEmpty()
group i by i.Name into g
from p in g
orderby g.Count() descending
select new { Name = g.Key, Count = g.Count() }.Name;
4

1 に答える 1

2

クエリは左外部結合を実行して、お気に入りのない食材を含めます。問題は、お気に入りのない各成分について、DefaultIfEmpty() によって生成される単一の値をカウントしていることです。次のようにカウントするときに、デフォルト値を除外できます。

orderby g.Count(x => x != null) descending

実際には左結合を実行する必要はありません。グループ参加からグループの数を合計するだけです。

from i in db.Ingredients 
join p in db.PersonalInfos on i.ID equals p.FavoriteIngredient.ID into faves
group faves.Count() by i.Name into faveCounts
let count = faveCounts.Sum()
orderby count descending
select new { Name = faveCounts.Key, Count = count };

group byコードの主観的な問題は、すべてのandfrom句が非常に混乱することです。これが問題になる場合は、よりわかりやすい名前を使用するか、サブクエリを使用するか、メソッド構文を使用してみてください。

編集:これはメソッド構文のバージョンです。それは非常に醜いので、クエリ構文バージョンからの直接変換ではありません。

db.Ingredients
  .GroupJoin(db.PersonalInfos,
             i => i.ID,
             p => p.ID, 
             (i, g) => new { i.Name, FaveCount = g.Count() })
  .GroupBy(x => x.Name,
           (key, grp) => new { Name = key, Count = grp.Sum(y => y.FaveCount) })
  .OrderByDescending(x => x.Count);
于 2012-12-04T01:52:48.090 に答える