Die Kombination von zwei Ausdrücken (Ausdruck<U<T, bool>>)
Habe ich zwei Ausdrücke vom Typ Expression<Func<T, bool>>
und ich will zu nehmen, ODER, UND, oder, NICHT, diese und erhalten einen neuen Ausdruck der gleichen Art
Expression<Func<T, bool>> expr1;
Expression<Func<T, bool>> expr2;
...
//how to do this (the code below will obviously not work)
Expression<Func<T, bool>> andExpression = expr AND expr2
Sehr nützlicher post hab ich von Google: LINQ to Entities: Kombination von Prädikaten
InformationsquelleAutor BjartN | 2009-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, können Sie verwenden
Expression.AndAlso
/OrElse
etc zu kombinieren, logische Ausdrücke, aber das problem ist, die Parameter; arbeiten Sie mit der gleichenParameterExpression
im expr1 und expr2? Wenn dem so ist, ist es einfacher:Dies funktioniert auch gut, zu negieren einer einzigen operation:
Ansonsten, je nach dem LINQ-provider, die Sie vielleicht in der Lage sein, Sie zu kombinieren mit
Invoke
:Irgendwo, ich habe einige code, der re-schreibt einen Ausdruck-Baum ersetzen von Knoten zu entfernen, die Notwendigkeit für
Invoke
, aber es ist ziemlich lang (und ich kann mich nicht erinnern, wo ich es verlassen habe...)Generalisierte version wählt den einfachsten Weg:
Ab .net 4.0. Es ist die ExpressionVistor Klasse, die ermöglicht Ihnen das erstellen von Ausdrücken, die EF sicher.
+1 die verallgemeinerte version funktioniert wie ein Charme, ich verwendet Und stattdessen von andalso, ich dachte, linq to sql nicht unterstützt andalso?
hier ist ein rewriter können inline die Bäume zum speichern Aufrufen: stackoverflow.com/questions/1717444/...
schauen Sie sich jetzt den Termin: die .NET framework-Besucher (
ExpressionVisitor
) nicht vorhanden zurück dann; ich habe ein Verwandtes Beispiel auf stackoverflow aus einem ähnlichen Zeitpunkt wo es implementiert die Besucher manuell: es ist ein viel der code.Ich bin mit deiner ersten Lösung zu kombinieren, die meine Ausdrücke, und alles ist in Ordnung, auch in Entity Framework, Also was wären die Vorteile der Verwendung von die Letzte Lösung sein?
InformationsquelleAutor Marc Gravell
Können Sie den Ausdruck verwenden.AndAlso /OrElse zu kombinieren, logischen Ausdrücken, aber Sie müssen sicherstellen, dass die ParameterExpressions sind die gleichen.
Ich Probleme mit EF und die PredicateBuilder also habe ich meinen eigenen gemacht, ohne Rückgriff auf "Invoke", die ich verwenden könnte, wie diese:
Source-code für meine PredicateBuilder:
- Und die utility-Klasse zu ersetzen, die dem Parameter in einen lambda-Ausdruck:
Danke. Ich habe gefunden, den code sinnvoll in eine Menge von Orten.
Dies ist eine großartige Lösung.
Adam, das löste ein sehr nerviges problem ich hatte mit dem SharePoint Client Object model, Linq-provider - Dank für die Buchung es.
Dieser arbeitete für mich! Ich hatte gesucht für eine Vielzahl von Lösungen, sowie-Prädikat-generator und nichts gearbeitet, bis diese. Danke!!!
InformationsquelleAutor Adam Tegen
Joe Albahari (Autor von C# 3.0 in a Nutshell und LINQPad) schrieb ein Programm namens PredicateBuilder verwendet werden können und-UND ODER-Funktionen zusammen.
http://www.albahari.com/nutshell/predicatebuilder.aspx
Während es funktioniert Funktionen es ist open source, so können Sie check it out und sehen, wie es funktioniert.
Ich bin nicht einverstanden. PredicateBuilder code ist weitgehend identisch mit der gewählten Antwort, aber die gewählte Antwort liefert Erklärung/code, sondern direkt via link.
PredicateBuilder FUNKTIONIERT NICHT IN EF!!!!!!!!!!!!!!! Es wertet die Abfrage aus der server wendet dann die gewünschte Prädikat in Speicher statt der übergabe das Prädikat SQL-Einschränkung der Ergebnismenge. Dies ist der Grund, warum PredicateBuilder ist nicht wünschenswert, für diesen Anwendungsfall! VORSICHT
Vielleicht könnten Sie verbringen einige Zeit, herauszufinden, warum es nicht funktioniert in EF5, anstatt zu warten, für die Antwort bevormundet Sie.
Ich hatte bereits geschrieben eine neue PredicateBuilder mir, das funktioniert und optimiert den Ausdruck von Bäumen. Dieses snippet hat mir das Letzte Stück, das ich brauchte, das war der Besucher Komponente. Ich war kaum warten, für etwas zu sein Löffel gefüttert, wenn Sie ernsthaft wollen Ihre Punkte zurück, die schlecht Bearbeiten Sie Ihre Antwort, und ich nehme wieder die -1. Allerdings, wenn jemand sucht, etwas zu tun, mit Ausdruck<U<T,bool>> es in der Regel bedeutet, dass Sie verwenden möchten, EF. Sonst würden Sie nur benutzt haben, Func<T,bool>
InformationsquelleAutor Cameron MacFarland
Wenn Ihr provider unterstützt nicht Aufrufen, und Sie brauchen, um zu kombinieren zwei Ausdruck, die Sie verwenden können, eine ExpressionVisitor ersetzen die parameter in den zweiten Ausdruck durch den parameter in dem ersten Ausdruck.
Dies ist eine großartige Lösung.
InformationsquelleAutor Francis
Schlage ich vor, eine weitere Verbesserung PredicateBuilder und
ExpressionVisitor
Lösungen. Ich nannte esUnifyParametersByName
und Sie können finden Sie in der MIT Bibliothek von mir: LinqExprHelper. Es erlaubt die Kombination von beliebigen lambda-Ausdrücke. In der Regel die Frage, Prädikat Ausdruck, aber diese Idee erstreckt sich auch auf die Projektion Ausdrücken, wie gut.Den folgenden code beschäftigt eine Methode
ExprAdres
schafft eine komplizierte parametrisierten Ausdruck, die Verwendung von inline-lambda. Dieser komplizierte Ausdruck kodiert nur einmal, und wieder, Dank derLinqExprHelper
mini-Bibliothek.- Und dies ist der Teilausdruck Gebäude-code:
Was ich versucht habe zu erreichen, war parametrisierten Abfragen, ohne zu müssen zu kopieren und zu kleben und mit der Fähigkeit zu verwenden, inline-lambdas, die sind so schön. Ohne all diese Helfer-expression Zeug, würde ich gezwungen werden, zu erstellen, die gesamte Abfrage in einem Rutsch.
InformationsquelleAutor Jarekczek
Brauchte ich, um die gleichen Ergebnisse erzielen, aber mit etwas mehr generische (als Typ nicht bekannt war). Dank marc ' s Antwort, die ich endlich herausgefunden, was ich war versuchen zu erreichen:
InformationsquelleAutor VorTechS
Ich denke, das funktioniert gut, nicht wahr ?
InformationsquelleAutor Céline