web-dev-qa-db-fra.com

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

J'ai une liste de orders.
Je souhaite sélectionner orders en fonction d’un ensemble d’états 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;
142
MartinS

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

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

ou en syntaxe de requête:

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

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;
13
user439931

Essayez avec Contains fonction;

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));
11
Soner Gönül

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

Ainsi, au lieu de contient en remplacement de ???? dans votre code, vous pouvez utiliser N'importe quel 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 en SQL, c'est pourquoi ce n'est pas si évident.

Bien sûr, si vous préférez une syntaxe fluide, voici:

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

Nous retrouvons ici l’une des surprises LINQ (comme Joda-speech qui met select à la fin). Cependant, il est assez logique dans ce sens de vérifier si au moins un des éléments (c'est-à-dire any ) d'une liste (ensemble, collection) correspond à une seule valeur.

10
Alexander Christov