Podejrzewam chcesz:
var songsByUser = songs.UserSongs
.GroupBy(song => song.UserId, song => song.SongId)
.Select(g => new SongsForUser { User = g.Key,
Songs = g.ToList() });
Aby wyjaśnić, po GroupBy
będziesz miał kilka grup, w których kluczem każdej grupy jest identyfikatorem użytkownika, a wartości w obrębie grupę stanowią identyfikatory piosenki:
Key = 1, Values = 1, 4, 12
Key = 2, Value = 95
to jesteś tylko konwersja że w swoim rodzaju SongsForUser
. Zauważ, że nie musisz jawnie włączać ()
podczas wywoływania konstruktora w inicjalizatorze obiektów - jest to niejawne, chyba że musisz podać argumenty konstruktora.
Ty mógłby to zrobić w jednym GroupBy
rozmowy przy okazji:
var songsByUser = songs.UserSongs
.GroupBy(song => song.UserId, song => song.SongId,
(user, ids) => new SongsForUser { User = user,
Songs = ids.ToList() });
Osobiście zwykle znaleźć osobny Select
połączenia się bardziej czytelny.
Można również zrobić to wszystko o wyrażeniu kwerendy:
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: Powyżej jest „dostawcą neutralne”, ale wygląda na to, że nie działa z LINQ do podmiotów. Ci może w stanie zmusić go do pracy tak:
var songsByUser = songs.UserSongs
.GroupBy(song => song.UserId, song => song.SongId)
.AsEnumerable()
.Select(g => new SongsForUser { User = g.Key,
Songs = g.ToList() });
AsEnumerable
wezwanie zmusi zgrupowanie do zrobienia w bazie danych, ale ostateczna projekcja (w tym wezwanie ToList
) do zrobienia lokalnie. Powinieneś jednak sprawdzić wygenerowany kod SQL pod względem wydajności.
Dlaczego wybrać identyfikator utworu tylko w projekcji, a nie jako część grupy ? –
Powoduje to błąd w części 'ToList'. Wierzę, że może tak być, ponieważ jest to Linq dla podmiotów. Błąd: 'LINQ to Entities nie rozpoznaje metody 'System.Collections.Generic.List'1 [System.String] ToList [String] (System.Collections.Generic.IEnumerable'1 [System.String])' method, oraz tej metody nie można przetłumaczyć na wyrażenie w sklepie. " –
@AbeMiessler upewnij się, że masz' using System.Linq' up top. –