Expression.Or,参数'item'不在范围内

cco*_*ook 8 c# linq expression expression-trees

我试图写一个静态函数或两个表达式,但收到以下错误:

参数'item'不在范围内.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.InvalidOperationException:参数"item"不在范围内.

方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:添加更多信息

正在或将来的表达式来自下面的方法,执行得很好.如果有更好的方法或结果我都是耳朵.此外,我不知道有多少人提前或正在.

public static Expression<Func<T, bool>> FilterExpression(string filterBy, object Value, FilterBinaryExpression binaryExpression)
{
    // Define the parameter to use
    var param = Expression.Parameter(typeof(T), "item");

    // Filter expression on the value
    switch (binaryExpression)
    {
        case FilterBinaryExpression.Equal:
            {
                // Build an expression for "Is the parameter equal to the value" by employing reflection
                var filterExpression = Expression.Lambda<Func<T, bool>>
                    (Expression.Equal(
                        Expression.Convert(Expression.Property(param, filterBy), typeof(TVal)),
                        Expression.Constant(Value)
                     ),
                    param);
                // Build the expression and return it
                return (filterExpression);
            }
Run Code Online (Sandbox Code Playgroud)

编辑:添加更多信息

或者,是否有更好的方法来做或?目前.Where(约束)在约束类型为Expression>的情况下工作得很好.我该怎么做(constraint1或constraint2)(约束为n'th)

提前致谢!

Jb *_*ain 9

问题是您在方法OrExpressions中创建的表达式重用了两个表达式的主体.这些实体将包含对自己的ParameterExpression的引用,该引用已在FilterExpression中定义.

修复是重写左右部分以使用新的ParameterExpression.或者传递原始的ParameterExpression.这不是因为两个ParameterExpression具有相同的名称,它们代表相同的参数.


小智 5

正如已经建议的那样,在这里你可以找到这个非常好的(工作)代码

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);
}
Run Code Online (Sandbox Code Playgroud)

你可以适应你的需求,而不是绑定(恕我直言)LINQ.