3

我有一些代码可以根据用户输入动态构建一些搜索条件,从而将Expression<Func<T, bool>>其传递给 LINQ .Where() 方法。当输入存在时它工作正常,但是当输入存在时,我想创建一个简单的'return false;' 语句,以便不返回任何结果。

下面是我当前的尝试,但是当它被传递给 .Where() 方法时,它会抛出 NotSupportedException“‘Block’类型的未知 LINQ 表达式”。

var parameter = Expression.Parameter(typeof(T), "x");
var falseValue = Expression.Constant(false);
var returnTarget = Expression.Label(typeof (bool));

var returnFalseExpression = Expression.Block(Expression.Return(returnTarget, falseValue), Expression.Label(returnTarget, falseValue));
var lambdaExpression = Expression.Lambda<Func<T, bool>>(returnFalseExpression, parameter);

如何构建可以由 LINQ 解释的“return false”表达式?

4

2 回答 2

8
Expression<Func<T, bool>> falsePredicate = x => false;
于 2012-11-23T10:33:05.847 回答
6

你能把整个事情包装在一个 if-else 表达式中吗?

意义:

if input
    return <your normal code>
else
    return false

return 隐含在表达式中;表达式的返回值将只是最后一个值。所以你可以尝试:

    Expression.Condition
    (
      Expression.NotEqual(input, Expression.Constant("")), 
      normalSearchExpression, 
      Expression.Constant(false)
    )

假设normalSearchExpression还返回一个布尔值。

于 2012-11-23T10:44:13.937 回答