Ich versuche, eine statische Funktion zu Oder zwei Ausdrücke zu schreiben, aber empfange den folgenden Fehler:
Der Parameter 'item' ist nicht im Bereich.
Beschreibung: Eine nicht behandelte Ausnahme aufgetreten während der Ausführung der aktuelle Webanfrage Bitte überprüfen Sie die Stack-Trace für weitere Informationen über der Fehler und wo es entstanden ist der Code.
Ausnahmedetails: System.InvalidOperationException: Die Parameter 'Element' ist nicht im Bereich.
die Methode:
%Vor%Bearbeiten : Weitere Informationen hinzufügen
Die Ausdrücke, die or sind, kommen von der folgenden Methode, die gut ausgeführt wird. Wenn es einen besseren Weg zu den Ergebnissen gibt, bin ich ganz Ohr. Außerdem weiß ich nicht, wie viele im Voraus sind.
%Vor%Bearbeiten : Hinzufügen weiterer Informationen
Alternativ, gibt es einen besseren Weg, ein oder? Derzeit funktioniert die .Where (constraint) genau dort, wo die Constraint vom Typ Expression & gt; ist. Wie kann ich wo (constraint1 oder constraint2) (zur constraint n'th) machen
Vielen Dank im Voraus!
Das Problem besteht darin, dass der Ausdruck, den Sie in der Methode OrExpressions erstellen, den Text der beiden Ausdrücke wieder verwendet. Diese Körper enthalten Verweise auf ihre eigene ParameterExpression, die in FilterExpression definiert wurde.
Eine Korrektur wäre, die linken und rechten Teile neu zu schreiben, um den neuen ParameterExpression zu verwenden. Oder um den ursprünglichen ParameterExpression mitzugeben. Es ist nicht, weil die beiden ParameterExpression denselben Namen haben, dass sie denselben Parameter darstellen.
Wie bereits vorgeschlagen, hier können Sie diesen sehr schönen (funktionierenden) Code finden
%Vor%das Sie an Ihre Bedürfnisse anpassen können und die nicht an LINQ gebunden sind.
Ich bin mir nicht sicher über die richtigen Begriffe hier, aber im Grunde Ausdruck Parameter sind nicht gleichwertig, auch wenn sie den gleichen Namen haben.
Das bedeutet, dass
%Vor%param1 und param2 sind nicht dasselbe, wenn sie in einem Ausdruck verwendet werden.
Der beste Weg, um damit fertig zu werden, besteht darin, zuerst einen Parameter für Ihren Ausdruck zu erstellen und ihn dann an alle Hilfsfunktionen zu übergeben, die den Parameter benötigen.
BEARBEITEN: Wenn Sie versuchen, die where-Klausel in LINQ dynamisch zu erstellen, können Sie PredicateBuilder angeben ein Versuch.
Für diejenigen, die diese Seite durch eine Suchmaschine gefunden haben und den PredicateBuilder von Ben & amp; Joe Albahari verwenden, achten Sie darauf, da nicht mit dem Entity Framework
Probieren Sie stattdessen diese Version .
Fabrizios Lösung kam mir ebenfalls in den Sinn, aber da ich versuchte, zwei Ausdrücke zu kombinieren, die als eine linq 2-SQL-Abfrage ausgeführt würden, dachte ich, sie würde im Speicher und nicht auf dem SQL-Server ausgeführt werden.
Ich wurde geschrieben - Linq-To-Sql erkennt, dass der Aufruf ein Lambda-Ausdruck ist und erzeugt daher immer noch optimierte SQL.
Tags und Links c# linq expression expression-trees