public static Expression <Hoisted <TIn, TOut> > Hoist(Expression <Func <TIn, TOut> > expr) { // rewrite Expression<Func<TIn, TOut>> as Expression<Hoisted<TIn, TOut>> var visitor = new HoistingExpressionVisitor <TIn, TOut>(); var rewrittenBodyExpr = visitor.Visit(expr.Body); var rewrittenLambdaExpr = Expression.Lambda <Hoisted <TIn, TOut> >(rewrittenBodyExpr, expr.Parameters[0], _hoistedConstantsParamExpr); return(rewrittenLambdaExpr); }