我正在尝试使用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)和b和C”。
答案 0 :(得分:4)
这些谓词的“动态”方面根本不清楚。当您使用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
将它们组合在一起以生成最终谓词。