Linq: найти элемент в коллекции

у меня есть коллекция под названием Albums с объектами из класса Album. Этот класс имеет свойство Songs, который представляет собой коллекцию Song объекты. Каждый Song имеет уникальный идентификатор.

public IQueryable<Album> Albums

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

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

возможно ли, используя Linq, найти песню в коллекции альбомов? Я понятия не имею, как, я новичок в Линг. Я попробовал немного:

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

Спасибо большое,

Винсент

5 ответов


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

SelectMany создаст сплющенный список всех песен для всех альбомов, позволяющий выбрать первый с соответствующим идентификатором.


Если вы хотите вернуть альбом, содержащий песню с заданным ID, вы должны использовать следующий запрос:

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

Если вы хотите получить песне:

Albums.SelectMany(a=>a.Songs).FirstOrDefault(s => s.Id == Id); 

вам нужно сделать это, если у вас есть альбом...

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

или это, если вы не...

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

мое предложение найти ablum с определенной песней:

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

var query = from album in Albums
            from song in album.Songs
            where song.Id == id;

var song = query.FirstOrDefault();