Linq selecciona objetos en la lista donde existe EN (A, B, C)
Tengo una lista de orders
.
Quiero seleccionar orders
segú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;
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;
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.
var statuses = new[] { "A", "B", "C" };
var filteredOrders = from order in orders.Order
where statuses.Contains(order.StatusCode)
select order;
Pruebe con Contains
la 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));