te sospecho que desee:
var songsByUser = songs.UserSongs
.GroupBy(song => song.UserId, song => song.SongId)
.Select(g => new SongsForUser { User = g.Key,
Songs = g.ToList() });
de explicar, después de la GroupBy
usted tendrá un montón de grupos, donde la clave de cada grupo es el ID de usuario y los valores dentro del grupo son las identificaciones de canciones:
Key = 1, Values = 1, 4, 12
Key = 2, Value = 95
Luego estás a convertir ese tipo en su SongsForUser
. Tenga en cuenta que no necesita incluir explícitamente el ()
al llamar al constructor en un inicializador de objetos; está implícito a menos que necesite especificar argumentos de constructor.
Usted podría hacerlo todo en un solo GroupBy
llamada, por cierto:
var songsByUser = songs.UserSongs
.GroupBy(song => song.UserId, song => song.SongId,
(user, ids) => new SongsForUser { User = user,
Songs = ids.ToList() });
Personalmente lo general encontramos un Select
llamada independiente a ser más legible.
También puede hacer todo esto con una expresión de consulta:
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: Lo anterior es "proveedor neutral" pero parece que no funciona con LINQ a Entidades. Usted puede ser capaz de conseguir que funcione de esta manera:
var songsByUser = songs.UserSongs
.GroupBy(song => song.UserId, song => song.SongId)
.AsEnumerable()
.Select(g => new SongsForUser { User = g.Key,
Songs = g.ToList() });
La llamada AsEnumerable
obligará a la agrupación por hacer en la base de datos, pero la proyección final (incluyendo la llamada ToList
) para hacer a nivel local. Sin embargo, debería verificar la eficacia del SQL generado.
Por qué seleccionar la ID de canción solo dentro de la proyección, en lugar de como parte de la agrupación ? –
Esto arroja un error en la parte 'ToList'. Creo que puede ser porque esto es Linq para Entidades. Error: 'LINQ to Entities no reconoce el método 'System.Collections.Generic.List'1 [System.String] ToList [String] (System.Collections.Generic.IEnumerable'1 [System.String])', y este método no se puede traducir a una expresión de tienda. –
@AbeMiessler asegúrese de tener 'using System.Linq' en la parte superior. –