如何使用多个嵌套的“ands”和“ors”创建 linq 谓词

Ama*_*son 4 linq expression-trees predicatebuilder

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

我目前有一个方法,它接受一个标准对象列表,然后将它们解析成多个谓词,就像这篇文章中描述的那样。

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

WHERE 
    ((a == <val1>) AND (b == <val2>) AND (c == <val3>))
OR
    ((a == <val4>) AND (b == <val2>) AND (c == <val3>))
Run Code Online (Sandbox Code Playgroud)

但我需要它像这样工作:

WHERE 
    ((a == <val1> OR a == <val4>) AND (b == <val2>) AND (c == <val3>))
OR
    ((a == <val7>) AND (b == <val5>) AND (c == <val6>))
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点,以便我可以将两个“OR”“组合”在一起,以便逻辑正确流动?我不想要“a OR a AND b AND c”,我需要“(a OR a) AND b and C”。

Ani*_*Ani 5

这些谓词的“动态”方面根本不清楚。为什么要费心用和表达式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);
Run Code Online (Sandbox Code Playgroud)

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