如何为Entity Framework创建一个'不是'Lambda表达式

9

鉴于以下情况

Expression<Func<T,bool>> matchExpression;

如何创建一个与现有表达式相反的“非”表达式。

我已经尝试过:

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

但是这并不受实体框架的支持...

问候

1个回答

10
您需要重新创建一个新的Lambda,并否定原始Lambda的主体:
Expression<Func<T, bool>> not = Expression.Lambda<Func<T, bool>> (
    Expression.Not (matchExpression.Body),
    matchExpression.Parameters [0]);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接