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 HashSet
gebruikt in plaats van List
voor 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 Genre
een 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();