Linq, где список содержит список в списке
Используя linq, как я могу получить список элементов, где его список атрибутов соответствует другому списку?
Возьмите этот простой пример и псевдокод:
List<Genres> listofGenres = new List<Genre>() { "action", "comedy" });
var movies = _db.Movies.Where(p => p.Genres.Any() in listofGenres);
Ответы
Ответ 1
Похоже, вы хотите:
var movies = _db.Movies.Where(p => p.Genres.Intersect(listOfGenres)).Any();
или предоставление предиката в вызове Any
, чтобы сделать все за один раз:
var movies = _db.Movies.Any(p => p.Genres.Intersect(listOfGenres));
Ответ 2
Для этого можно использовать запрос Contains
:
var movies = _db.Movies.Where(p => p.Genres.Any(x => listOfGenres.Contains(x));
Ответ 3
Думаю, это тоже возможно?
var movies = _db.Movies.TakeWhile(p => p.Genres.Any(x => listOfGenres.Contains(x));
Является ли "TakeWhile" хуже, чем "Где" в смысле производительности или ясности?
Ответ 4
Или как это
class Movie
{
public string FilmName { get; set; }
public string Genre { get; set; }
}
...
var listofGenres = new List<string> { "action", "comedy" };
var Movies = new List<Movie> {new Movie {Genre="action", FilmName="Film1"},
new Movie {Genre="comedy", FilmName="Film2"},
new Movie {Genre="comedy", FilmName="Film3"},
new Movie {Genre="tragedy", FilmName="Film4"}};
var movies = Movies.Join(listofGenres, x => x.Genre, y => y, (x, y) => x).ToList();