Как создать предикат linq с несколькими вложенными «ands» и «ors» - PullRequest
3 голосов
/ 15 августа 2011

Я пытаюсь динамически создать выражение linq во время выполнения, используя PredicateBuilder из http://www.albahari.com/nutshell/predicatebuilder.aspx.

В настоящее время у меня есть метод, который берет список объектов критериев, а затем анализирует их в несколько предикатов, как описано вthis 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>))

Как я могу сделать так, чтобы я мог "сгруппировать" два "ИЛИ" вместе, чтобы логика работала правильно?Я не хочу «ИЛИ, А, И, И, И», мне нужно «(ИЛИ, А), И, В и С».

1 Ответ

4 голосов
/ 15 августа 2011

«Динамический» аспект этих предикатов вообще не ясен.Зачем беспокоиться о 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 их вместе, чтобы получить окончательный предикат.

...