Wie funktioniert PredicateBuilder?
C# in a Nutshell ist eine freie Klasse namens PredicateBuilder die LINQ-Konstrukte Prädikate Stück für Stück verfügbar hier. Hier ist ein Auszug von der Methode, die fügt einen neuen Ausdruck für das Prädikat. Könnte mir jemand das erklären? (Ich habe gesehen,diese Frageich möchte nicht eine Allgemeine Antwort, wie es. Ich bin auf der Suche nach einer bestimmten Erklärung, wie Ausdruck.Aufruf und Ausdruck.Lambda-bauen Sie den neuen Ausdruck).
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);
}
InformationsquelleAutor der Frage just.another.programmer | 2012-07-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Let ' s sagen Sie haben:
Und kombinieren Sie Sie dann mit
PredicateBuilder
Was
PredicateBuilder
produziert, ist ein Ausdruck, der wie folgt aussieht:Wie Sie sehen können:
InvocationExpression
ist Art, wie die Ausdruck-äquivalente von einem Methodenaufruf (Aufruf einer routine, indem Sie Argumente für Parameter).And
s der erste Ausdruck, der Körper und dasInvocationExpression
zusammen zu produzieren, die Körper der resultierende lambda.Die Idee ist, dass die LINQ-Anbieter sollten in der Lage zu verstehen, die Semantik dieser operation und nehmen eine sinnvolle Vorgehen (z.B. eine SQL generiert, die wie
WHERE age >= 18 AND gender = 'Male'
).Jedoch oft, die Anbieter haben Probleme mit
InvocationExpression
s, wegen der offensichtlichen Komplikationen der Verarbeitung einer 'verschachtelten Ausdruck-aufrufen innerhalb eines Ausdrucks.'Um dies zu umgehen, LINQKit bietet auch die
Expand
Helfer. Dies ist im wesentlichen 'inlines' die Anrufung nennen, der elegant durch den Austausch der Anruf mit der Körper der verschachtelten Ausdruck, den Ersatz von Verwendungen des verschachtelten Ausdruck, dessen Parameter entsprechend (in diesem Fall, ersetzenp2
mitp1
). Dies sollte so etwas wie:Beachten Sie, dass dies, wie Sie hätte manuell kombiniert diese Prädikate, wenn Sie es selbst getan hätten in einen lambda-Ausdruck. Aber mit LINQKit herum, Sie können diese Prädikate aus unabhängigen Quellen und einfach zu kombinieren:
InformationsquelleAutor der Antwort Ani