如何“不是”实体框架的 lambda 表达式

Posted

技术标签:

【中文标题】如何“不是”实体框架的 lambda 表达式【英文标题】:how to 'not' a lambda expression for entity framework 【发布时间】:2011-04-16 17:33:51 【问题描述】:

鉴于以下

Expression<Func<T,bool>> matchExpression;

如何创建另一个与现有表达式“不”的表达式。

我试过了

Expression<Func<T, bool>> func3 = (i) => !matchExpression.Invoke(i);

但是实体框架不支持这个...

问候

【问题讨论】:

【参考方案1】:

你必须重新创建一个新的 lambda,并否定原来的主体:

Expression<Func<T, bool>> not = Expression.Lambda<Func<T, bool>> (
    Expression.Not (matchExpression.Body),
    matchExpression.Parameters [0]);

【讨论】:

(你可以传入 matchExpression.Parameters - 它会是一样的) @Marc:当然。但在这种特定情况下,我喜欢它表达了用一个参数否定谓词的意图。 另外,在这个问题之后,我最终在 Mono.Linq.Expressions 的 PredicateBuilder 中添加了一种否定谓词的方法:github.com/jbevain/mono.linq.expressions 所以感谢 Richard :)

以上是关于如何“不是”实体框架的 lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

实体框架在执行 lambda 表达式时抛出错误

帮助我使用实体框架从 SQL 转换为 linq 嵌套 lambda 表达式

如何使用 lambda 表达式访问正确的数据类型?

C#如何使用 lambda 表达式将 iGrouping 返回到列表

有没有办法在 lambda 表达式树中使用“动态”?

基于子实体的属性构建 OrderBy Lambda 表达式