using System.Linq.Expressions;
Expression<Func<int, int>> result = x => x;
for (int i = 0; i < 10000; i++)
result = Combine(result, i => i + 1);
Console.WriteLine(result.Compile()(0));
Expression<Func<U, W>> Combine<U, V, W>(Expression<Func<U, V>> f, Expression<Func<V, W>> g)
var p = Expression.Parameter(typeof(U));
return Expression.Lambda<Func<U, W>>(Expression.Invoke(g, Expression.Invoke(f, p)), p);