我试图写一个静态函数或两个表达式,但收到以下错误:
参数'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)
提前致谢!
问题是您在方法OrExpressions中创建的表达式重用了两个表达式的主体.这些实体将包含对自己的ParameterExpression的引用,该引用已在FilterExpression中定义.
修复是重写左右部分以使用新的ParameterExpression.或者传递原始的ParameterExpression.这不是因为两个ParameterExpression具有相同的名称,它们代表相同的参数.
正如已经建议的那样,在这里你可以找到这个非常好的(工作)代码
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.