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); }
private static Func <TIn, TOut> CompileFromFingerprint(Expression <Func <TIn, TOut> > expr) { List <object> capturedConstants; ExpressionFingerprintChain fingerprintChain = FingerprintingExpressionVisitor.GetFingerprintChain(expr, out capturedConstants); if (fingerprintChain != null) { Hoisted <TIn, TOut> del = CachedExpressionCompiler.Compiler <TIn, TOut> ._fingerprintedCache.GetOrAdd(fingerprintChain, delegate(ExpressionFingerprintChain _) { Expression <Hoisted <TIn, TOut> > expression = HoistingExpressionVisitor <TIn, TOut> .Hoist(expr); return(expression.Compile()); }); return((TIn model) => del(model, capturedConstants)); } return(null); }