linq waar lijst iets in lijst bevat

Hoe kan ik met linq een lijst met items ophalen waarvan de lijst met kenmerken overeenkomt met een andere lijst?

Neem dit eenvoudige voorbeeld en pseudo-code:

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

Antwoord 1, autoriteit 100%

Klinkt alsof je wilt:

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

Antwoord 2, autoriteit 30%

U kunt hiervoor een Contains-query gebruiken:

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

Antwoord 3, autoriteit 3%

Als u HashSetgebruikt in plaats van Listvoor listofGenres, kunt u het volgende doen:

var genres = new HashSet<Genre>() { "action", "comedy" };   
var movies = _db.Movies.Where(p => genres.Overlaps(p.Genres));

Antwoord 4, autoriteit 2%

Ik denk dat dit ook zo kan?

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

Is “TakeWhile” slechter dan “Waar” in de zin van prestatie of duidelijkheid?


Antwoord 5

Als het Genreeen entiteit is en zijn eigen eigenschappen heeft, zoals Title, gebruik dan de volgende code:

var listofGenresName = new List<string> { "action", "comedy" };
var movies = _db.Movies.Where(p => p.Genres.Any(x => listofGenresName.Any(g=> g == x.Title)));

Antwoord 6

Of zoals dit

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

Other episodes