using System.Linq.Expressions;
public static void Main()
private static void InnerNotCompiled() {
Type propType = typeof(string);
var whereParam = Expression.Parameter(propType, "whereParam");
var whereExp = Expression.Call(typeof(System.Linq.Enumerable).GetMethods().First(a => a.Name == "Where" && a.GetParameters().Last().ParameterType.GenericTypeArguments.Length == 2).MakeGenericMethod(propType),
Expression.Constant(new[] { "test", "test2" }),
Expression.Lambda(Expression.NotEqual(Expression.Property(whereParam, "Length"), Expression.Constant(4)), whereParam));
var selectParam = Expression.Parameter(propType, "selectParam");
var selectExp = Expression.Call(typeof(System.Linq.Enumerable).GetMethods().First(a => a.Name == "Select" && a.GetParameters().Last().ParameterType.GenericTypeArguments.Length == 2).MakeGenericMethod(propType, typeof(int)),
Expression.Lambda(Expression.Property(selectParam, "Length"), selectParam));
var exp = Expression.Call(typeof(System.Linq.Enumerable).GetMethods().Where(a => a.Name == "FirstOrDefault" && a.ContainsGenericParameters && a.GetGenericArguments().Length == 1 && a.GetParameters().Length == 1).Single().MakeGenericMethod(typeof(int)), selectExp);
var f = (Func<int>)Expression.Lambda(exp).Compile();
private static void InnerCompiled() {
Type propType = typeof(string);
var whereParam = Expression.Parameter(propType, "whereParam");
var whereExp = Expression.Call(typeof(System.Linq.Enumerable).GetMethods().First(a => a.Name == "Where" && a.GetParameters().Last().ParameterType.GenericTypeArguments.Length == 2).MakeGenericMethod(propType),
Expression.Constant(new[] { "test", "test2" }),
Expression.Constant(Expression.Lambda(Expression.NotEqual(Expression.Property(whereParam, "Length"), Expression.Constant(4)), whereParam).Compile()));
var selectParam = Expression.Parameter(propType, "selectParam");
var selectExp = Expression.Call(typeof(System.Linq.Enumerable).GetMethods().First(a => a.Name == "Select" && a.GetParameters().Last().ParameterType.GenericTypeArguments.Length == 2).MakeGenericMethod(propType, typeof(int)),
Expression.Constant(Expression.Lambda(Expression.Property(selectParam, "Length"), selectParam).Compile()));
var exp = Expression.Call(typeof(System.Linq.Enumerable).GetMethods().Where(a => a.Name == "FirstOrDefault" && a.ContainsGenericParameters && a.GetGenericArguments().Length == 1 && a.GetParameters().Length == 1).Single().MakeGenericMethod(typeof(int)), selectExp);
var f = (Func<int>)Expression.Lambda(exp).Compile();