Expression.And
- это неправильная вещь, используемая здесь, она побитовая и.Вы хотите AndAlso
.
Кажется, что вы, кроме того, что уже знаете механизм построения дерева выражений.Так что вы действительно спрашиваете, как вы можете позволить вызывающей стороне вашего метода построения указать более сложный и гибкий способ объединения различных условий.
В конечном счете, для истинной гибкости вам нужен мини-язык запросов.Выполните синтаксический анализ языка для построения дерева выражений.
В краткосрочной перспективе вы можете обойтись гораздо более простым: списком примитивных выражений и флагом bool, указывающим, должны ли они сочетаться с && или ||.
Обновление - Я заметил, что вы фактически компилируете полученное выражение в реальный делегат.Это заставляет меня задаться вопросом, почему вы делаете это трудным путем в первую очередь.Почему бы просто не написать выражение в виде лямбды, как в вашем первоначальном примере?(Если вы используете Linq для SQL или EF, вам все равно не следует компилировать выражение.)
Обновление 2 - вам, вероятно, понадобится Dynamic Linq .