Kombinieren Sie zwei Linq, lambda-Ausdrücke
Expression<Func<MyObject, string>> fn1 = x => x.PossibleSubPath.MyStringProperty;
Expression<Func<string, bool>> fn2 = x => x.Contains("some literal");
Ist es ein Weg, um erstellen Sie eine neue lambda-Ausdruck, die im Grunde verwendet die Ausgabe von fn1 und verwendet Sie als input für fn2?
Expression<Func<MyObject, bool>> fnCombined = ...
Weiß ich, dass ich die Funktion auf einmal, aber das problem ist, dass ich einige generische code und daher wirklich brauchen, um in der Lage zu schaffen, diese beiden Funktionen getrennt, dann kombinieren Sie in einer Weise, dass Linq können Sie auf meine Datenbank-Objekten (Entity Framework).
- Hier ist eine Antwort, die zeigen Ausdruck manipulation/Kombination. stackoverflow.com/a/9683506/8155
- Danke für den link; ich hatte Schwierigkeiten, herauszufinden, wie um zu ersetzen Sie alle Instanzen eines Ausdrucks durch einen anderen.
- Vielen Dank, Jungs!
Du musst angemeldet sein, um einen Kommentar abzugeben.
So logisch, was wollen wir in der Lage sein zu tun ist, erstellen Sie eine neue lambda in denen die parameter der Eingabe, um die erste Funktion, und ein Körper, ruft die erste Funktion, die parameter und übergibt das Ergebnis als parameter an die zweite Funktion, und gibt dann das.
Wir können zu replizieren, die leicht genug mit
Expression
Objekte:Traurig, EF und die meisten anderen Abfrage-Anbieter nicht wirklich wissen, was zu tun und wird nicht richtig funktionieren. Wann immer Sie Treffer mit einem
Invoke
Ausdruck, die Sie in der Regel nur eine Ausnahme werfen Art. Einige kann behandeln es aber. In der Theorie alle Informationen, die Sie benötigen ist es, wenn Sie geschrieben werden mit der Robustheit, um auf Sie.Was wir jedoch tun kann ist, aus konzeptioneller Sicht, ersetzen Sie jede Instanz der ersten lambda-parameter in lambda-Körper mit dem parameter eine neue lambda, die wir schaffen, und dann ersetzen Sie alle Instanzen von der zweiten lambda-parameter in der zweiten lambda-Ausdruck mit den neuen body von der ersten lambda. Technisch, wenn diese Ausdrücke Nebeneffekte haben, und diese Parameter werden verwendet, mehr als einmal, Sie wäre nicht die gleiche, aber wie diese werden analysiert, die durch eine EF-Abfrage Anbieter Sie sollten wirklich nicht immer Nebenwirkungen haben.
Dank David B für die Bereitstellung einen link zu in diesem Zusammenhang Frage die eine
ReplaceVisitor
Umsetzung. Wir können diesenReplaceVisitor
zu gehen durch die gesamte Struktur eines Ausdrucks und ersetzen eines Ausdrucks durch einen anderen. Die Umsetzung dieser Typ ist:Und jetzt können wir schreiben unsere richtige
Combine
Methode:und ein einfacher Testfall, um einfach nur zeigen, was Los ist:
Dem heraus gedruckt wird:
Das ist genau das, was wir wollen; eine Abfrage-Anbieter wissen, wie zu analysieren, dass so etwas wie.
fn2
verwendet seine parameter mehr als einmalfn1
wird wiederholt, mehr als einmal. Hoffentlich ist das entweder trivial oder behandelt wird intelligent durch die Abfrage provider, aber das konnte am Ende die bedeutende Arbeit, die getan werden, mehrere Male (so etwas wie eine lokale variable, die sollten funktionieren, außer Abfrage-Anbieter wohl nicht unterstützen).x => x.condition == true && x.anotherCondition == false
das zweite x ist nicht gleich x in der ersten. (Sie können sich wahrscheinlich word, was ich bin versucht zu sagen besser)