Поскольку Include
является методом расширения, ваше выражение
x => x.Include(m => m.MaterialGroup);
на самом деле является
x => QueryableExtensions.Include(x, m => m.MaterialGroup);
Так что для объединения ваших выражений необходимо заменить первый аргумент Include
на вызовеще один Include
x => QueryableExtensions.Include(
QueryableExtensions.Include(x, m => m.MaterialSomething),
m => m.MaterialGroup);
Следующий код сделает эту цепочку
public static Expression<Func<IQueryable<T>, object>> Chain<T>(
params Expression<Func<IQueryable<T>, object>>[] expressions)
{
if (expressions.Length == 0)
throw new ArgumentException("Nothing to chain");
if (expressions.Length == 1)
return expressions[0];
Expression body = expressions[0].Body;
var parameter = expressions[0].Parameters[0];
foreach (var expression in expressions.Skip(1))
{
var methodCall = (MethodCallExpression)expression.Body;
var lambda = (UnaryExpression)methodCall.Arguments[1];
body = Expression.Call(typeof(QueryableExtensions),
"Include",
new []{ typeof(T), ((LambdaExpression)lambda.Operand).Body.Type},
body, lambda
);
}
return Expression.Lambda<Func<IQueryable<T>, object>>(body, parameter);
}
Использование:
var expression = Chain(expression1, expression2 /*, expression3 .... */);
Вы можете проверить это онлайн здесь
Обратите внимание, что этот код пропускает проверку выражения для краткости.