Вам нужно изменить генерацию так, чтобы она строила сбалансированное дерево вместо последовательности OR
s, где левое поддерево является единственным выражением, а правое поддерево содержит все остальные элементы. Графический:
Your code Better
--------- --------
OR OR
#1 OR OR OR
#2 OR #1 #2 #3 #4
#3 #4
Как видите, даже в этом простом случае лучший подход не такой глубокий (рекурсивно вложенный). Код для создания лучшего дерева выражений может быть написан как рекурсивный метод в C #:
Expression GenerateTree(List<Expression> exprs, int start, int end) {
// End of the recursive processing - return single element
if (start == end) return exprs[start];
// Split the list between two parts of (roughly the same size)
var mid = start + (end - start)/2;
// Process the two parts recursively and join them using OR
var left = GenerateTree(exprs, start, mid);
var right = GenerateTree(exprs, mid+1, end);
return Expression.Or(left, right);
}
// Then call it like this:
var equalsList = equals.ToList();
var body = GenerateTree(equalsList, 0, equalsList.Length);
Я не пробовал код, поэтому могут быть небольшие ошибки, но это должно показать идею.