private LambdaExpression Parameterize(Expression query, out object[] arguments) { IQueryProvider provider = this.FindProvider(query); if (provider == null) { throw new ArgumentException(Res.ArgumentQuery); } var ep = provider as IDbContext; // turn all relatively constant expression into actual constants Func <Expression, bool> fnCanBeEvaluated = e => ep != null?ExpressionHelper.CanBeEvaluatedLocally(e) : true; var body = PartialEvaluator.Eval(query, fnCanBeEvaluated); // convert all constants into parameters List <ParameterExpression> parameters; List <object> values; body = Parameterizer.Parameterize(body, out parameters, out values); // make sure the body will return a value typed as 'object'. if (body.Type != typeof(object)) { body = Expression.Convert(body, typeof(object)); } // make a lambda expression with these parameters arguments = values.ToArray(); if (arguments.Length < 5) { return(Expression.Lambda(body, parameters.ToArray())); } else { // too many parameters, use an object array instead. arguments = new object[] { arguments }; return(ExplicitToObjectArray.Rewrite(body, parameters)); } }