linq где список содержит любой в списке


используя linq, как я могу получить список элементов, где его список атрибутов соответствует другому списку?

возьмем этот простой пример и псевдокод:

List<Genres> listofGenres = new List<Genre>() { "action", "comedy" });   
var movies = _db.Movies.Where(p => p.Genres.Any() in listofGenres);
4 89

4 ответа:

звучит так, как вы хотите:

var movies = _db.Movies.Where(p => p.Genres.Intersect(listOfGenres)).Any();

или предоставление предиката в Any вызов, чтобы сделать все это за один раз:

var movies = _db.Movies.Any(p => p.Genres.Intersect(listOfGenres));

можно использовать Contains запрос для этого:

var movies = _db.Movies.Where(p => p.Genres.Any(x => listOfGenres.Contains(x));

или такой

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

Я думаю, это тоже возможно подобное?

var movies = _db.Movies.TakeWhile(p => p.Genres.Any(x => listOfGenres.Contains(x));

является ли "TakeWhile" хуже, чем "Where" в смысле производительности или ясности?