Expression.Or, le paramètre 'item' n'est pas dans la portée

c# expression expression-trees linq

Question

J'essaie d'écrire une fonction statique dans Ou deux expressions, mais recevez l'erreur suivante:

Le paramètre 'item' n'est pas dans la portée.

Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Consultez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails d'exception: System.InvalidOperationException: le paramètre 'item' n'est pas dans la portée.

la méthode:

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);
}

edit : ajouter plus d'informations

Les expressions en cours ou sont issues de la méthode ci-dessous, qui s'exécute parfaitement. s'il y a un meilleur moyen ou les résultats, je suis tout ouïe. De plus, je ne sais pas combien sont ou sont en avance.

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);
}

edit : ajouter encore plus d'informations

Sinon, y a-t-il une meilleure façon de faire un ou? Actuellement, la contrainte (.Where) fonctionne parfaitement, où la contrainte est de type Expression>. Comment puis-je faire où (contrainte1 ou contrainte2) (à la contrainte n'th)

Merci d'avance!

Réponse acceptée

Le problème est que l'expression que vous créez dans la méthode OrExpressions réutilise le corps des deux expressions. Ces corps contiendront des références à leur propre ParameterExpression définie dans FilterExpression.

Une solution serait de réécrire les parties gauche et droite pour utiliser le nouveau ParameterExpression. Ou pour transmettre la ParameterExpression originale. Ce n'est pas parce que les deux ParameterExpression ont le même nom qu'elles représentent le même paramètre.


Réponse populaire

Comme nous l' avons suggéré, ici vous trouverez ce code très agréable (travail)

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);
}

que vous pouvez adapter à vos besoins et qui n'est pas lié (IMHO) à LINQ.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi