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)
提前致谢!
问题是您在方法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.