it-swarm.com.de

Linq Objekte in Liste auswählen, in denen IN existiert (A, B, C)

Ich habe eine Liste von orders.
Ich möchte orders basierend auf einer Reihe von Auftragsstatus auswählen.

Also im Wesentlichen 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

Ihre Statuscodes sind auch eine Sammlung, verwenden Sie also Contains :

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

oder in Abfragesyntax:

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

Versuchen Sie es mit der Funktion Contains ;

Bestimmt, ob eine Sequenz ein bestimmtes Element enthält.

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

NB: Dies ist LINQ für Objekte. Ich bin nicht zu 100% sicher, ob es in LINQ für Entitäten funktioniert, und ich habe keine Zeit, es jetzt zu überprüfen. Tatsächlich ist es nicht allzu schwierig, es in x in [A, B, C] zu übersetzen, aber Sie müssen es selbst überprüfen.

Also, anstelle von Enthält als Ersatz für ???? in Ihrem Code können Sie Beliebig verwenden, was mehr für LINQ steht:

// 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 ist das Gegenteil von dem, was Sie von SQL kennen, deshalb ist es nicht so offensichtlich.

Wenn Sie hier eine flüssige Syntax bevorzugen, ist dies natürlich:

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

Hier sehen wir wieder eine der LINQ-Überraschungen (wie Joda-Rede, die select am Ende setzt). In diesem Sinne ist es jedoch sehr logisch, dass überprüft wird, ob mindestens eines der Elemente (dh any) in einer Liste (set, collection) mit einem einzelnen Wert übereinstimmt.

10