2011-11-09 26 views
6

Tengo una colección llamada Albums con objetos de la clase Album. Esta clase tiene una propiedad Songs, que es una colección de objetos Song. Cada Song tiene una identificación única.Linq: Encontrar elemento en una colección

public IQueryable<Album> Albums 

public class Album 
{ 
    ... 
    public virtual ICollection<Song> Songs { get; set; } 
    ... 
} 

public class Song 
{ 
    public int Id { get; set; } 
    ... 
} 

¿Es posible, usando LINQ, para encontrar una canción en la colección del álbum? No tengo idea de cómo, soy nuevo en Ling. Probé un poco:

Albums.FirstOrDefault(a => a.Songs.Id == id); 

Muchas gracias,

Vicente

Respuesta

12
Albums.SelectMany(a=>a.Songs).FirstOrDefault(song => song.Id == id) 

El SelectMany creará una lista aplanada de todas las canciones para todos los álbumes, lo que le permite seleccionar la primera con la identificación adecuada.

+0

Gracias, Daz Lewis – Vinzcent

3

Es necesario hacer esto si tiene un álbum ...

var album = GetAlbum(); 
var song = album.Songs.FirstOrDefault(s => s.ID == id); 

o esto si no ...

var song = albumsCollection.SelectMany(s => s.Songs).FirstOrDefault(s => s.ID == id); 
0

Mi sugerencia para encontrar un ablum con una cierta canción:

Album albumFound = Albums.FirstOrDefault(item => item.Songs.FirstOrDefault(song => song.Id == id) != null); 
3

Si desea devolver el álbum que contiene la canción con un ID dado, se debe utilizar la siguiente consulta:

Albums.FirsOrDefault(a => a.Songs.Any(s => s.Id == Id)); 

si usted quiere conseguir la canción:

Albums.SelectMany(a=>a.Songs).FirstOrDefault(s => s.Id == Id); 
0
var query = from album in Albums 
      from song in album.Songs 
      where song.Id == id; 

var song = query.FirstOrDefault(); 
Cuestiones relacionadas