【问题标题】:Linq: Create logical inverse of expressionLinq:创建表达式的逻辑逆
【发布时间】:2011-11-07 10:39:46
【问题描述】:

我想创建一个接受Expression<Func<T, bool>> 并创建它的逻辑逆的方法(即它会返回false,而它会返回true,反之亦然。这比我更难心想。这就是我要做的:

public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> expression)
{
  return Expression.Lambda<Func<T, bool>>(Expression.Not(expression.Body));
}

编译正常,但调用时抛出以下异常:

Test method Tests.Common.Unit.LinqPredicateBuilderTests.CanInverseAPredicate threw exception: 
System.ArgumentException: Incorrect number of parameters supplied for lambda declaration

我不知道我在做什么。有谁可以填空吗?

【问题讨论】:

  • inverse 有点误导。我理解为从输出计算输入。
  • 我很抱歉。我的术语跟不上。

标签: c# linq expression-trees


【解决方案1】:

当您应该转发源表达式的单个参数时,您正在调用 Expression.Lambda 创建一个完全没有参数的表达式。

请注意,我们正在尝试创建 Expression&lt;Func&lt;T, bool&gt;&gt; 而不是 Expression&lt;Func&lt;bool&gt;&gt;

试试这个:

return Expression.Lambda<Func<T, bool>>(Expression.Not(expression.Body),
                                        expression.Parameters);

【讨论】:

  • 谢谢!到目前为止,这已经通过了我唯一的单元测试!我再写几篇,如果一切顺利的话,我会给你会费的!
  • 这与从IQueryable 得到逆有什么区别吗?
  • @cottsak:你能澄清一下你的意思吗? IQueryable 并没有任何直观的“逆”定义。您当然可以在构造可查询对象的过程中使用上述技术来反转 where 子句或类似的子句。
  • 嗨,阿尼。自从评论以来更多地考虑了这一点,我想我正在尝试将表达式树与IQueryable 进行比较,而不是单个表达式 lambda。如果表达式树是谓词的集合,那么IQueryable 是否也本质上是?
  • 让我开心!谢谢阿尼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
相关资源
最近更新 更多