I’m using some code (available here on MSDN) to dynamically build LINQ expressions containing multiple OR ‘clauses’.
The relevant code is
var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
This generates a LINQ expression that looks something like this:
(((((ID = 5) OR (ID = 4)) OR (ID = 3)) OR (ID = 2)) OR (ID = 1))
I’m hitting the recursion limit (100) when using this expression, so I’d like to generate an expression that looks like this:
(ID = 5) OR (ID = 4) OR (ID = 3) OR (ID = 2) OR (ID = 1)
How would I modify the expression building code to do this?
You need to modify the generation so that it builds a ballanced tree instead of a sequence of
ORs where the left sub-tree is a single expression and the right sub-tree contains all remaining elements. Graphically:As you can see, even in this simple case, the better approach is not as deeply (recursively nested). The code to generate the better expression tree can be written as a recursive method in C#:
I didn’t try the code, so there may be some minor mistakes, but it should show the idea.