[英]C# negate an expression
我正在寻找一种方法来否定用于过滤IQueryable
序列的表达式。
所以,我有类似的东西:
Expression<Func<T, bool>> expression = (x => true);
现在我想创建一个导致屈服(x => false)
的expression
- 所以我基本上想要否定expression
。
我发现自己的工作方法是这样的:
var negatedExpression =
Expression.Lambda<Func<T, bool>> (Expression.Not(expression.Body),
expression.Parameters[0])));
但我几乎肯定有更好的方法 - 你能帮助我吗? (可能是像Not(expression)
类的东西)。
一种简单的扩展方法:
public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> one)
{
var candidateExpr = one.Parameters[0];
var body = Expression.Not(one.Body);
return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
}
用法:
Expression<Func<int, bool>> condition = x => x > 5;
var source = Enumerable.Range(1, 10);
var result1 = source.Where(condition.Compile()); //6,7,8,9,10
var result2 = source.Where(condition.Not().Compile()); //1,2,3,4,5
张贴供将来参考。
Danny Chen的答案可以更通用:
public static Expression<TFunc> Not<TFunc>(this Expression<TFunc> baseExpr)
{
var param = baseExpr.Parameters;
var body = Expression.Not(baseExpr.Body);
var newExpr = Expression.Lambda<TFunc>(body, param);
return newExpr;
}
此版本可以接收包含任意数量输入参数的Expression。 然而,它只增加了一点可用性,因为Expression很可能会被传递给像IEnumerable.Where
这样的函数。
那这个呢?
Expression<Func<bool>> expr = () => true;
Expression<Func<bool>> negated = () => !expr.Compile()();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.