linq - 如何创建具有多个嵌套 "ands"和 "ors"的 linq 谓词

标签 linq expression-trees predicatebuilder

我正在尝试使用 http://www.albahari.com/nutshell/predicatebuilder.aspx 中的 PredicateBuilder 在运行时动态创建 linq 表达式。 .

我目前有一个方法,它接受一个标准对象列表,然后将它们解析为多个谓词,正如 post 中所述。 .

目前,我的代码支持以下场景:

WHERE 
    ((a == <val1>) AND (b == <val2>) AND (c == <val3>))
OR
    ((a == <val4>) AND (b == <val2>) AND (c == <val3>))

但我需要它像这样工作:

WHERE 
    ((a == <val1> OR a == <val4>) AND (b == <val2>) AND (c == <val3>))
OR
    ((a == <val7>) AND (b == <val5>) AND (c == <val6>))

如何才能将两个“OR”“分组”在一起,以便逻辑正常流动?我不需要“a OR a AND b AND c”,我需要“(a OR a) AND b and C”。

最佳答案

这些谓词的“动态”方面根本不清楚。当您可以使用 &&|| 表达式(当然带有适当的括号)组装所需的表达式时,为什么还要费心 PredicateBuilder 呢?

无论如何,这里有一种使用 PredicateBuilder 完成您想要的事情的方法:

var p1 = PredicateBuilder.False<Foo>()
                         .Or(foo => foo.A == <val1>)
                         .Or(foo => foo.A == <val4>)
                         .And(foo => foo.B == <val2>)
                         .And(foo => foo. C == <val3>);

var p2 = PredicateBuilder.False<Foo>()
                         .Or(foo => foo.A == <val7>)
                         .And(foo => foo.B == <val5>)
                         .And(foo => foo.C == <val6>);

var finalPredicate = p1.Or(p2);

这个想法是创建单独的“简单”表达式,然后最后将它们OR在一起生成最终谓词。

关于linq - 如何创建具有多个嵌套 "ands"和 "ors"的 linq 谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7066431/

相关文章:

c# - PredicateBuilder 的问题

c# - LINQ to Entities 无法识别方法 "GetUserById"

JAVA:如何实现带有join语句的sql的延迟加载?

LinqKit PredicateBuilder 与 EF 4 CPT 5 表关系?

c# - 如何在 C# 中通过表达式树构建集合过滤器

c# - 如何使用 F# lambda 创建 Linq 表达式树?

c# - PredicateBuilder<True> 和 PredicateBuilder<False> 之间的区别?

vb.net - Linq - 左外连接 - 数据表

c# - 将 Linq 表达式转换为 URI : The method 'Select' is not supported 时出错

c# - 可访问 'this' 的非静态表达式<Func<X>>