web-dev-qa-db-fra.com

Comment faire une requête "in" dans le framework d'entité?

Comment puis-je effectuer une sélection dans linq sur des entités pour sélectionner des lignes avec des clés dans une liste? Quelque chose comme ça:

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 la méthode Contains comme mentionné dans certaines des réponses mais cela ne fonctionne pas et lève cette exception:

LINQ to Entities ne reconnaît pas la méthode 'Boolean Contains [Int32] (System.Collections.Generic.IEnumerable`1 [System.Int32], Int32)'), et cette méthode ne peut pas être traduite en une expression de magasin.

49
NotDan

Essaye ç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);

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

Entity Framework ne prend actuellement pas en charge les paramètres de valeur de collection ("statusesToFind" dans votre exemple). Pour contourner cette restriction, vous pouvez construire manuellement une expression en fonction d'une séquence de valeurs à l'aide de la méthode utilitaire suivante:

42
Andrew Hare

J'ai eu le même problème et j'ai résolu comme ç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);
21
eka808

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

La solution est donc un peu plus impliquée.

Cependant, j'ai un article de blog sur ce sujet exact ici . Essentiellement, la solution consiste à utiliser un petit arbre magique d'expression pour construire une grande expression OR.

J'espère que cela t'aides

Alex

8
Alex James