2011-11-09 20 views
6

Mam kolekcję o nazwie Albums z obiektami z klasy Album. Ta klasa ma właściwość Songs, która jest zbiorem obiektów Song. Każdy numer Song ma unikalny identyfikator.Linq: Znajdź element w kolekcji

public IQueryable<Album> Albums 

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

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

Czy to możliwe, przy użyciu LINQ, aby znaleźć utwór w kolekcji albumu? Nie mam pojęcia jak, jestem nowy w Ling. Próbowałem trochę:

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

Wielkie dzięki,

Vincent

Odpowiedz

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

Urządzenie SelectMany utworzy spłaszczoną listę wszystkich utworów dla wszystkich albumów, umożliwiając następnie wybranie pierwszego z odpowiednim identyfikatorem.

+0

Dzięki, Daz Lewis – Vinzcent

3

Trzeba to zrobić, jeśli masz płytę ...

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

Albo to, że jeśli nie ...

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

Moja sugestia, aby znaleźć ablum z pewnej piosenki:

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

Jeśli chcesz powrócić album zawierający piosenki z podanym ID, należy użyć następującego zapytania:

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

jeśli chcesz dostać piosenkę:

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