が欲しい:GroupBy
あなたは、各グループのキーはユーザーIDであるグループ、の束を持っています後、
var songsByUser = songs.UserSongs
.GroupBy(song => song.UserId, song => song.SongId)
.Select(g => new SongsForUser { User = g.Key,
Songs = g.ToList() });
を説明するために、そして内の値グループは、歌のIDがされています。そして、あなたは自分のSongsForUser
型にそれを変換している
Key = 1, Values = 1, 4, 12
Key = 2, Value = 95
。オブジェクトイニシャライザでコンストラクタを呼び出すときに、()
を明示的にインクルードする必要はありません。コンストラクタの引数を指定する必要がない限り暗黙的です。
あなたが方法により、全て1回のGroupBy
呼び出しでこれを行うことができます:
var songsByUser = songs.UserSongs
.GroupBy(song => song.UserId, song => song.SongId,
(user, ids) => new SongsForUser { User = user,
Songs = ids.ToList() });
は個人的に私は通常、読みやすくするために、別の
Select
コールを見つけます。
また、クエリ式でこのすべてを行うことができます。
var songsByUser = from song in songs.UserSongs
group song.SongId by song.UserId into g
select new SongsForUser { User = g.Key, Songs = g.ToList() };
EDIT:上記は「プロバイダ中立」であるが、それはエンティティへのLINQで動作していないているように聞こえます。あなたはそれがこのように動作するように取得することができる場合があります
var songsByUser = songs.UserSongs
.GroupBy(song => song.UserId, song => song.SongId)
.AsEnumerable()
.Select(g => new SongsForUser { User = g.Key,
Songs = g.ToList() });
AsEnumerable
呼び出しは、データベースに行われるグループ化を強制しますが、(ToList
コールを含む)は、最終的な投影がローカルで行われます。しかし、効率のために生成されたSQLをチェックする必要があります。
public class SongsForUser
{
public int UserId;
public List<int> Songs;
}
そこでここでは、このような関数が行います。
ソングIDはグループ化の一部ではなく、投影内でのみ選択するのはなぜですか? –
これは 'ToList'部分にエラーを投げています。私はこれがエンティティへのLinqであるかもしれないと信じています。エラー: 'LINQ to Entitiesは、 'System.Collections.Generic.List'1 [System.String] ToList [String](System.Collections.Generic.IEnumerable'1 [System.String])メソッドを認識しません。このメソッドをストア式に変換することはできません。 ' –
@AbeMiesslerは、 'using System.Linq'を上にしてください。 –