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

c# expression expression-trees linq

Frage

Ich versuche, eine statische Funktion für Oder zwei Ausdrücke zu schreiben, aber den folgenden Fehler zu erhalten:

Der Parameter 'item' ist nicht im Gültigkeitsbereich.

Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für weitere Informationen über den Fehler und wo es aus dem Code stammt.

Ausnahmedetails: System.InvalidOperationException: Der Parameter 'item' ist nicht im Gültigkeitsbereich.

die Methode:

public static Expression<Func<T, bool>> OrExpressions(Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
{
    // Define the parameter to use
    var param = Expression.Parameter(typeof(T), "item");

    var filterExpression = Expression.Lambda<Func<T, bool>>
         (Expression.Or(
             left.Body,
             right.Body
          ), param);
    // Build the expression and return it
    return (filterExpression);
}

Bearbeiten : Hinzufügen weiterer Informationen

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. Ich weiß auch nicht, wie viele im Voraus sind.

public static Expression<Func<T, bool>> OrExpressions(Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
{
    // Define the parameter to use
    var param = Expression.Parameter(typeof(T), "item");

    var filterExpression = Expression.Lambda<Func<T, bool>>
         (Expression.Or(
             left.Body,
             right.Body
          ), param);
    // Build the expression and return it
    return (filterExpression);
}

Bearbeiten : Hinzufügen weiterer Informationen

Oder gibt es einen besseren Weg, ein oder? Derzeit funktioniert die .Where (constraint) genau dort, wo die Bedingung vom Typ Expression> ist. Wie kann ich wo tun (constraint1 oder constraint2) (zur constraint n'th)

Danke im Voraus!

Akzeptierte Antwort

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 liegt nicht daran, dass die beiden ParameterExpression denselben Namen haben, da sie den gleichen Parameter darstellen.


Beliebte Antwort

Wie bereits vorgeschlagen, hier finden Sie diesen sehr schönen (funktionierenden) Code

public static Expression<Func<T, bool>> Or<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.Or(expr1.Body, invokedExpr), expr1.Parameters);
}

dass Sie sich an Ihre Bedürfnisse anpassen können und nicht an LINQ (IMHO) gebunden sind.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum