Linq selecteer objecten in lijst waar IN (A,B,C) bestaat

Ik heb een lijst met orders.
Ik wil ordersselecteren op basis van een reeks bestelstatussen.

Dus in wezen 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;

Antwoord 1, autoriteit 100%

Uw statuscodes zijn ook een verzameling, dus gebruik Contains:

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

of in querysyntaxis:

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

Antwoord 2, autoriteit 6%

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

Antwoord 3, autoriteit 5%

NB:dit is LINQ voor objecten, ik weet niet 100% zeker of het in LINQ werkt voor entiteiten, en ik heb nu geen tijd om het te controleren. In feite is het niet zo moeilijk om het te vertalen naar x in [A, B, C], maar je moet het zelf controleren.

Dus in plaats van Bevatals vervanging van de ????in uw code, kunt u Elkegebruiken, wat meer 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;

Het is het tegenovergestelde van wat je weet van SQL, daarom is het niet zo duidelijk.

Natuurlijk, als je hier de voorkeur geeft aan vloeiende syntaxis, dan is dat:

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

Hier zien we weer een van de LINQ-verrassingen (zoals Joda-speech die select aan het einde zet). In die zin is het echter vrij logisch dat het controleert of ten minste één van de items (dat wil zeggen any) in een lijst (set, verzameling) overeenkomt met een enkele waarde.


Antwoord 4, autoriteit 5%

Probeer het met Containsfunctie;

Bepaalt of een reeks een gespecificeerd element bevat.

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

Antwoord 5

Wees voorzichtig, .Contains()komt overeen met elke subtekenreeks, inclusief de tekenreeks die u niet verwacht. Voor bijv. new[] { "A", "B", "AA" }.Contains("A")geeft je zowel A als AA die je misschien niet wilt. Ik ben er door gebeten.

.Any()of .Exists()is een veiligere keuze

Other episodes