Ich habe eine LINQ-Abfrage, die wie folgt aussieht:
DateTime today = DateTime.UtcNow;
var results = from order in context.Orders
where ((order.OrderDate <= today) && (today <= order.OrderDate))
select order;
Ich versuche LINQ zu lernen / zu verstehen. In einigen Fällen muss ich zwei zusätzliche WHERE-Klauseln hinzufügen. Um dies zu erreichen, verwende ich:
if (useAdditionalClauses)
{
results = results.Where(o => o.OrderStatus == OrderStatus.Open) // Now I'm stuck.
}
Wie Sie sehen können, kann ich eine zusätzliche WHERE-Klausel hinzufügen. Aber wie füge ich mehrere hinzu? Zum Beispiel möchte ich hinzufügen
WHERE o.OrderStatus == OrderStatus.Open AND o.CustomerID == customerID
zu meiner vorherigen Anfrage. Wie mache ich das mit Erweiterungsmethoden?
Vielen Dank!
Sie können sie weiter verketten, wie Sie es getan haben.
Dies stellt ein UND dar.
quelle
Wenn Sie mit speicherinternen Daten arbeiten (lesen Sie "Sammlungen von POCO"), können Sie Ihre Ausdrücke auch mit PredicateBuilder wie folgt stapeln :
// initial "false" condition just to start "OR" clause with var predicate = PredicateBuilder.False<YourDataClass>(); if (condition1) { predicate = predicate.Or(d => d.SomeStringProperty == "Tom"); } if (condition2) { predicate = predicate.Or(d => d.SomeStringProperty == "Alex"); } if (condition3) { predicate = predicate.And(d => d.SomeIntProperty >= 4); } return originalCollection.Where<YourDataClass>(predicate.Compile());
Die vollständige Quelle der Erwähnung
PredicateBuilder
ist unten (Sie können aber auch die Originalseite mit einigen weiteren Beispielen überprüfen ):using System; using System.Linq; using System.Linq.Expressions; using System.Collections.Generic; public static class PredicateBuilder { public static Expression<Func<T, bool>> True<T> () { return f => true; } public static Expression<Func<T, bool>> False<T> () { return f => false; } public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ()); return Expression.Lambda<Func<T, bool>> (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters); } public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ()); return Expression.Lambda<Func<T, bool>> (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters); } }
Hinweis : Ich habe diesen Ansatz mit dem Projekt Portable Class Library getestet und muss ihn verwenden
.Compile()
, damit er funktioniert:quelle
Sicherlich:
if (useAdditionalClauses) { results = results.Where(o => o.OrderStatus == OrderStatus.Open && o.CustomerID == customerID) }
Oder nur ein weiterer
.Where()
Aufruf wie dieser (obwohl ich nicht weiß, warum Sie das möchten, es sei denn, er wird durch eine andere boolesche Steuervariable aufgeteilt):if (useAdditionalClauses) { results = results.Where(o => o.OrderStatus == OrderStatus.Open). Where(o => o.CustomerID == customerID); }
Oder eine andere Neuzuweisung zu
results
: `results = results.Where ( blah ).quelle
Sie können && verwenden und alle Bedingungen in dieselbe where-Klausel schreiben, oder Sie können .Where (). Where (). Where () ... und so weiter.
quelle
Die Auswahl ist nicht erforderlich, da Sie bereits mit einer Bestellung arbeiten.
quelle
Verwenden Sie den
&&
Operator einfach wie bei jeder anderen Anweisung, die Sie für die boolesche Logik benötigen.if (useAdditionalClauses) { results = results.Where( o => o.OrderStatus == OrderStatus.Open && o.CustomerID == customerID) }
quelle