Linq sélectionne les objects dans la liste où existe IN (A, B, C)

J’ai une liste de orders .
Je souhaite sélectionner des orders fonction d’un ensemble de statuts de commande.

Donc, essentiellement, select orders where order.StatusCode in ("A", "B", "C")

 // Filter the orders based on the order status var filteredOrders = from order in orders.Order where order.StatusCode.????????("A", "B", "C") select order; 

Merci beaucoup.

Vos codes de statut sont également une collection, utilisez donc Contains :

 var allowedStatus = new[]{ "A", "B", "C" }; var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode)); 

ou dans la syntaxe de requête:

 var filteredOrders = from order in orders.Order where allowedStatus.Contains(order.StatusCode) select order; 
 var statuses = new[] { "A", "B", "C" }; var filteredOrders = from order in orders.Order where statuses.Contains(order.StatusCode) select order; 

Essayez avec la fonction Contains ;

Détermine si une séquence contient un élément spécifié.

 var allowedStatus = new[]{ "A", "B", "C" }; var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode)); 

NB: il s’agit de LINQ aux objects, je ne suis pas sûr à 100% si cela fonctionne dans LINQ aux entités, et n’ai pas le temps de le vérifier maintenant. En fait, ce n’est pas trop difficile de le traduire en x dans [A, B, C] mais vous devez vérifier par vous-même.

Donc, au lieu de Contient en remplacement de la ???? dans votre code, vous pouvez utiliser Any qui est plus LINQ-uish:

 // Filter the orders based on the order status var filteredOrders = from order in orders.Order where new[] { "A", "B", "C" }.Any(s => s == order.StatusCode) select order; 

C’est le contraire de ce que vous savez de SQL, c’est pourquoi ce n’est pas si évident.

Bien sûr, si vous préférez la syntaxe courante, voici:

 var filteredOrders = orders.Order.Where(order => new[] {"A", "B", "C"}.Any(s => s == order.StatusCode)); 

Ici encore, nous voyons une des sursockets LINQ (comme Joda-speech qui met select à la fin). Cependant, il est tout à fait logique qu’il vérifie si au moins l’un des éléments d’une liste (ensemble, collection) correspond à une seule valeur.

Soyez prudent, .Contains() correspondra à toute sous-chaîne, y compris la chaîne à laquelle vous ne vous attendez pas. Par exemple new[] { "A", "B", "AA" }.Contains("A") vous new[] { "A", "B", "AA" }.Contains("A") fois A et AA, ce que vous ne voudrez peut-être pas. J’ai été mordu par ça.

.Any() ou .Exists() est un choix plus sûr