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