123 votes

linq where list contains any in list

En utilisant linq, comment puis-je récupérer une liste d'éléments dont la liste d'attributs correspond à une autre liste ?

Prenons cet exemple simple et ce pseudo-code :

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

217voto

Jon Skeet Points 692016

On dirait que vous voulez :

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

0 votes

J'ai essayé d'utiliser cette requête pour la boîte de recherche, elle recherche n'importe quel caractère dans la colonne Person_Name, j'ai obtenu cette erreur : 'DbIntersectExpression requires arguments with compatible collection ResultTypes' alors j'ai essayé .StartWith, .EndsWith, .Contains de ici Cela fonctionne, mais que peut-on faire pour utiliser votre requête ?

0 votes

@stom : Nous n'avons pas assez d'informations pour vous aider à ce sujet - vous devriez poser une nouvelle question avec un numéro d'identification. lot plus de contexte.

0 votes

@JonSkeet J'utilise toujours la méthode Contains pour ce genre de questions. J'ai été curieux en voyant votre réponse et j'ai vérifié l'implémentation interne et j'ai trouvé que Intersect utilise Set. Pouvez-vous me dire quelle est la différence de performance entre ces deux méthodes ?

65voto

BrokenGlass Points 91618

Vous pouvez utiliser un Contains pour cela :

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

6voto

Efraim Bart Points 51

Si vous utilisez HashSet au lieu de List para listofGenres vous pouvez faire :

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

4voto

Trevor Points 1

Je suppose que c'est également possible de cette manière ?

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

Est-ce que "TakeWhile" est pire que "Where" en termes de performance ou de clarté ?

0 votes

TakeWhile est une fonction différente - elle arrête l'itération lorsqu'elle ne trouve pas de correspondance.

2voto

Hamed Lohi Points 246

Si le Genre est une entité et possède ses propres propriétés telles que Title utiliser le code suivant :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X