Expression.Or, Der Parameter 'item' ist nicht im Gültigkeitsbereich

8

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!

    
ccook 04.01.2009, 21:44
quelle

5 Antworten

9

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.

    
Jb Evain 04.01.2009, 22:23
quelle
4

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.

    
Fabrizio C. 05.01.2009 13:46
quelle
2

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.

    
Cameron MacFarland 04.01.2009 22:27
quelle
2

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 .

    
Alex Che 25.09.2012 16:38
quelle
1

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.

    
Tahir Hassan 11.03.2010 21:49
quelle