组合 Func<bool> 表达式[重复]

Posted

技术标签:

【中文标题】组合 Func<bool> 表达式[重复]【英文标题】:Combining Func<bool> expressions [duplicate] 【发布时间】:2012-11-11 22:55:22 【问题描述】:

可能重复:Combining two expressions (Expression<Func<T, bool>>)

我有一个方法接受一个 Expression&lt;Func&lt;bool&gt;&gt; 参数

void MethodOne(Expression<Func<bool>> expression)

我有多个Expression&lt;Func&lt;bool&gt;&gt; 实例。如何使用Expression.OrElse 将这些表达式动态组合成一个Expression&lt;Func&lt;bool&gt;&gt;(即构建表达式树)?

例如,如果我有两个表达式,例如

() => objectA.PropertyOneIsSet

() => objectB.PropertyTwoIsSet

我希望最终结果是:

() => objectA.PropertyOneIsSet || objectB.PropertyTwoIsSet

所以我可以将它传递给我上面的方法。

【问题讨论】:

查看this question,这似乎包含您的问题... 有件事我忘了说:我有 N 个这样的表达式(超过 2 个),我想 OrElse 全部。 【参考方案1】:

您可以创建 ExpressionVisitor 来组合查询。查看此 msdn 博客以获取更多信息:Combining Predicates(答案 3)。他在谈论 EF,但你可以在你的情况下使用它

【讨论】:

【参考方案2】:

您可以使用表达式.Any(x => x.CallMethod) 来实现此目标。

【讨论】:

我需要有选择地组合表达式,即我不想总是在最终结果中包含所有表达式。类似if(someCondition) result = result.OrElse(expressionN); 您需要根据一些业务规则/逻辑动态地准备这个表达式集合。但要使用 Any 扩展方法执行聚合集合。 我需要将结果作为 Func> 的实例。 Any() 将只返回一个布尔值。 那么你需要这样的东西:albahari.com/nutshell/predicatebuilder.aspx

以上是关于组合 Func<bool> 表达式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何组合两个 lambdas [重复]

将 List<Expression<Func<T, bool>>> 组合到 OR 子句 LINQ [重复]

实体框架过滤器“表达式<Func<T, bool>>”

Lambda 表达式以及如何组合它们?

如何在不使用 Invoke 方法的情况下组合两个 lambda 表达式?

Expression<Func<T,bool>> 声明是啥意思?