2011-11-09 26 views
6

ho una collezione chiamata Albums con oggetti della classe Album. Questa classe ha una proprietà Songs, che è una raccolta di oggetti Song. Ogni Song ha un ID unico.Linq: Trova elemento di una collezione

public IQueryable<Album> Albums 

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

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

E 'possibile, utilizzando LINQ, per trovare una canzone nella collezione album? Non ho idea di come, Sono nuovo di Ling. Ho provato un po ':

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

Grazie mille,

Vincent

risposta

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

SelectMany creerà un elenco appiattito di tutti i brani per tutti gli album, permettendoti quindi di selezionare il primo con l'id appropriato.

+0

Grazie, Daz Lewis – Vinzcent

3

Hai bisogno di fare questo se si dispone di un album ...

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

O questo, se si non ...

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

Il mio suggerimento per trovare un ablum con una certa canzone:

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

Se si desidera restituire l'album che contiene il brano con un dato id, si dovrebbe utilizzare la seguente query:

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

se si vuole ottenere la canzone:

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(); 
Problemi correlati