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

#c# #asp.net #linq

#c# #asp.net #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 найти песню в коллекции альбомов?Я понятия не имею, как, я новичок в Ling.
Я немного попробовал:

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

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

Винсент

Ответ №1:

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

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

Ответ №2:

Это необходимо сделать, если у вас есть альбом…

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

Или это, если вы этого не сделаете…

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

Ответ №3:

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

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

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

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

Ответ №4:

Мое предложение найти аблум с определенной песней:

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

Ответ №5:

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

var song = query.FirstOrDefault();