評価について知りたいすべての情報が集計情報(合計、平均、カウントなど)である場合は、次のようなことを行うことができます。
var profiles = from userprof in Ent.UserProfiles
join userrating in Ent.UserRatings on userprofs.UserId equals userratings.UserId
where userrating.DateAdded >= drm.Start
group userrating by userprof into g
select new {g.Key.UserID, g.Key.UserName, Count = g.Count(), Avg = g.Avg(r => r.RatingValue) };
個々のアイテムに関してlinqクエリを定義するため、複数形を単数形に変更したことに注意してください(UserProfilesは複数形であり、userprofは各アイテムの「中」にあります)。
これには、SQLへの簡単な変換があります。
SELECT up.userID, up.userName, COUNT(ur.*), AVG(ur.ratingValue)
FROM UserProfiles up JOIN UserRatings ur
ON up.userID = ur.userID
WHERE dateAdded > {whatever drm.Start is}
GROUP BY up.userID, up.userName
個々の評価を取得できるようにしたい場合、これは単一のSQLクエリとあまり一致しません。次のようにすることができます。
var profiles = from userprof in Ent.UserProfiles
join userrating in Ent.UserRatings on userprofs.UserId equals userratings.UserId
where userrating.DateAdded >= drm.Start
group new{userrating.RatingValue, userrating.SomeThing} by new{userprof.UserID, userprof.UserName};
これIEnumerable<Grouping<{anonymous object}, {anonymous object}>>
により、反復して新しい反復を取得し、それKey.UserID
をKey.UserName
反復して次のように反復できるようにitem.RatingValue
なりますitem.SomeThing
(デモンストレーション用に追加しました。値だけが必要な場合は、次のようになりますIEnumerable<Grouping<{anonymous object}, int>>
) 。これ:
foreach(var group in profiles)
{
Console.WriteLine("The user is :" + group.Key.UserName + " (id: " + group.Key.UserID ")");
foreach(var item in group)
{
Console.WriteLine(item.SomeThing + " was rated " + item.RatingValue);
}
}
ただし、これに伴う問題は、これがマップされる優れた単一のSQLクエリがないことです。Linqは最善を尽くしますが、それはいくつかのクエリを実行することを意味するので、それを手伝うほうがよいでしょう:
var profiles = from item in (from userprof in Ent.UserProfiles
join userrating in Ent.UserRatings on userprofs.UserId equals userratings.UserId
where userrating.DateAdded >= drm.Start
select new{userrating.RatingValue, userrating.SomeThing, userprof.UserID, userprof.UserName}).AsEnumerable()
group new{item.RatingValue, item.SomeThing} by new{item.UserID, item.UserName}
これは以前と同じ出力ですが、SQLに変換すると、単一のクエリを実行でき、残りの作業はメモリ内で実行されます。99%の場合、このように一部の作業をメモリにドラッグすると効率が低下しますが、前のクエリにはマップできるSQLクエリが1つもないため、例外です。