private static MethodCallExpression Apply(string methodName, Expression source, Expression argument = null) { var result = Expression.Call( type: typeof(Queryable), methodName: methodName, typeArguments: methodName == "Select" || methodName.StartsWith("OrderBy", StringComparison.Ordinal) ? source.Type.GetGenericArguments(typeof(IQueryable <>)) .Concat(new[] { ((LambdaExpression)LinqHelpers.UnQuote(argument)).ReturnType }) .ToArray() : source.Type.GetGenericArguments(typeof(IQueryable <>)), arguments: argument != null ? new[] { source, argument } : new[] { source } ); return(result); }