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); }
private static Func <TIn, TOut> CompileFromFingerprint(Expression <Func <TIn, TOut> > expr) { List <object> capturedConstants; ExpressionFingerprintChain fingerprint = FingerprintingExpressionVisitor.GetFingerprintChain(expr, out capturedConstants); if (fingerprint != null) { var del = fingerprintedCache.GetOrAdd(fingerprint, _ => { // Fingerprinting succeeded, but there was a cache miss. Rewrite the expression // and add the rewritten expression to the cache. var hoistedExpr = HoistingExpressionVisitor <TIn, TOut> .Hoist(expr); return(hoistedExpr.Compile()); }); return(model => del(model, capturedConstants)); } // couldn't be fingerprinted return(null); }