Linq selecciona objetos en la lista donde existe EN (A, B, C)

Resuelto MartinS asked hace 11 años • 5 respuestas

Tengo una lista de orders.
Quiero seleccionar orderssegún un conjunto de estados de pedido.

Así que esencialmenteselect 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;
MartinS avatar Jan 10 '13 18:01 MartinS
Aceptado

Tus códigos de estado también son una colección, así que usa Contains:

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

o en la sintaxis de consulta:

var filteredOrders = from order in orders.Order
                     where allowedStatus.Contains(order.StatusCode)
                     select order;
Tim Schmelter avatar Jan 10 '2013 11:01 Tim Schmelter

NB: esto es LINQ para objetos, no estoy 100% seguro de si funciona en LINQ para entidades y no tengo tiempo para comprobarlo ahora. De hecho, no es demasiado difícil traducirlo a x en [A, B, C] pero debes comprobarlo tú mismo.

Entonces, en lugar de Contiene como reemplazo de ???? en tu código puedes usar Cualquiera que sea más 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;

Es lo contrario de lo que sabes de SQL, por eso no es tan obvio.

Por supuesto, si prefieres una sintaxis fluida, aquí tienes:

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

Aquí volvemos a ver una de las sorpresas de LINQ (como Joda-speech que pone select al final). Sin embargo, en este sentido es bastante lógico que compruebe si al menos uno de los elementos (es decir, cualquiera ) de una lista (conjunto, colección) coincide con un único valor.

Alexander Christov avatar Jul 26 '2015 15:07 Alexander Christov
var statuses = new[] { "A", "B", "C" };

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;
 avatar Jan 10 '2013 11:01

Pruebe con Containsla función;

Determina si una secuencia contiene un elemento específico.

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
Soner Gönül avatar Jan 10 '2013 11:01 Soner Gönül