当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Expression.Or,参数'item'不在范围内》经验,为你挑选了2个好方法。

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

参数'item'不在范围内.

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

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

方法:

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

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

编辑:添加更多信息

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

public static Expression> 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>
                    (Expression.Equal(
                        Expression.Convert(Expression.Property(param, filterBy), typeof(TVal)),
                        Expression.Constant(Value)
                     ),
                    param);
                // Build the expression and return it
                return (filterExpression);
            }

编辑:添加更多信息

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

提前致谢!



1> Jb Evain..:

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

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



2> 小智..:

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

public static Expression> Or(this Expression> expr1, Expression> expr2)
{
    var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast());
    return Expression.Lambda>(Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
}

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

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有