Expression.Or, The parameter 'item' is not in scope

前端 未结 5 1141
一整个雨季
一整个雨季 2021-02-09 00:23

I am trying to write a static function to Or two expressions, but recieve the following error:

The parameter \'item\' is not in scope.

Descrip

相关标签:
5条回答
  • 2021-02-09 00:36

    Fabrizio's solution also occurred to me as well but since I was attempting to combine two expressions that would be executed as a linq 2 sql query, I thought it would execute in memory rather than the sql server.

    I was wrote - Linq-To-Sql recognises that the invocation is of a lambda expression and thus still produces optimized sql.

    0 讨论(0)
  • 2021-02-09 00:38

    The issue is that the Expression you're creating in the method OrExpressions reuses the body of the two expressions. Those bodies will contain references to their own ParameterExpression that has been defined in FilterExpression.

    A fix would be to rewrite the left and right parts to use the new ParameterExpression. Or to pass the original ParameterExpression along. It's not because the two ParameterExpression have the same name that they represent the same parameter.

    0 讨论(0)
  • 2021-02-09 00:47

    For those, who found this page by a search engine and is going to use the PredicateBuilder from Ben&Joe Albahari, watch out, since it does not work with the Entity Framework.

    Try this fixed version instead.

    0 讨论(0)
  • 2021-02-09 00:51

    As already suggested, here you can find this very nice (working) 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);
    }
    

    that you can adapt to your needs and which isn't tied (IMHO) to LINQ.

    0 讨论(0)
  • 2021-02-09 00:51

    I'm not sure about the proper terms here, but basically expression parameters are not equivalent even if they have the same name.

    That means that

    var param1 = Expression.Parameter(typeof(T), "item");
    var param2 = Expression.Parameter(typeof(T), "item");
    
    param1 != param2
    

    param1 and param2 won't be the same thing if used in an expression.

    The best way to deal with this is create one parameter up front for your expression, and then pass it to all helper functions that need the parameter.

    EDIT: Also, if you're trying to dynamically compose where clauses in LINQ, you could give PredicateBuilder a try.

    0 讨论(0)
提交回复
热议问题