49 votes

Comment faire une requête "in" dans le cadre de l'entité ?

Comment puis-je faire une sélection dans linq to entities pour sélectionner des lignes avec des clés dans une liste ? Quelque chose comme ceci :

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where (order.Key in orderKeys) 
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);

J'ai essayé d'utiliser le Contient comme indiqué dans certaines réponses, mais cela ne fonctionne pas et entraîne cette exception :

LINQ to Entities ne reconnaît pas la méthode 'Boolean ContainsInt32', et cette méthode ne peut pas être traduite en une expression de magasin.

42voto

Andrew Hare Points 159332

Essayez ça :

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where orderKeys.Contains(order.Key);
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);

Editar: J'ai trouvé quelques solutions de contournement pour ce problème - veuillez voir La clause WHERE IN ? :

L'Entity Framework ne actuellement pas les paramètres évalués par collection ('statusesToFind' dans votre exemple). exemple). Pour contourner ce problème restriction, vous pouvez manuellement construire manuellement une expression à partir d'une séquence de valeurs en utilisant la méthode suivante méthode utilitaire suivante :

21voto

eka808 Points 740

J'ai eu le même problème et je l'ai résolu comme suit

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where (orderKeys.Contains(order.Key)) 
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);

7voto

Alex James Points 15939

Malheureusement, l'EF ne peut pas traduire les requêtes que d'autres ont suggérées. Ainsi, si ces requêtes fonctionnent dans LINQ to Objects, elles ne fonctionneront pas dans LINQ to Entities.

La solution est donc un peu plus complexe.

Cependant, j'ai un article de blog sur ce sujet exact. aquí . Essentiellement, la solution consiste à utiliser un peu de magie de l'arbre d'expression pour construire une grande expression OR.

J'espère que cela vous aidera

Alex

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