using System.Data.Entity;
using System.Linq.Expressions;
public ClassA A {get; set;}
public ClassB B {get; set;}
public static void Main()
Expression<Func<IQueryable<Material>, object>> expression1 = x => x.Include(m => m.A);
Expression<Func<IQueryable<Material>, object>> expression2 = x => x.Include(m => m.B);
var chainedExp = Chain(expression1, expression2);
Console.WriteLine(GetDebugView(chainedExp));
private 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)
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),
new []{ typeof(T), ((LambdaExpression)lambda.Operand).Body.Type},
return Expression.Lambda<Func<IQueryable<T>, object>>(body, parameter);
private static string GetDebugView(Expression exp)
var propertyInfo = typeof(Expression).GetProperty("DebugView", BindingFlags.Instance | BindingFlags.NonPublic);
return propertyInfo.GetValue(exp) as string;