Ответы:
Похоже, вы хотите:
var movies = _db.Movies.Where(p => p.Genres.Intersect(listOfGenres).Any());
Containsповторное использование заканчивается операцией O (x * y) во времени, но O (1) в пространстве, где x - размер первой коллекции, а y - размер второй. Используется IntersectO (x + y) во времени, но O (y) в пространстве - он создает хэш-набор из второй коллекции, что позволяет быстро проверять включение любого элемента из первой коллекции. См codeblog.jonskeet.uk/2010/12/30/... подробности
Для этого можно использовать Containsзапрос:
var movies = _db.Movies.Where(p => p.Genres.Any(x => listOfGenres.Contains(x));
Если вы используете HashSetвместо Listfor, listofGenresвы можете:
var genres = new HashSet<Genre>() { "action", "comedy" };
var movies = _db.Movies.Where(p => genres.Overlaps(p.Genres));
Или вот так
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();
.StartWith, .EndsWith, .Containsиз здесь он работает, но то , что можно сделать , чтобы использовать запрос