public override TResult ExecuteScalar <TResult>(Object dataContext, OeQueryContext queryContext) { Cache.OeCacheContext cacheContext = queryContext.CreateCacheContext(); Cache.OeQueryCacheItem?queryCacheItem = base.QueryCache.GetQuery(cacheContext); InMemoryScalarExecutor <TResult> executor; IReadOnlyList <Cache.OeQueryCacheDbParameterValue> parameterValues; if (queryCacheItem == null) { var variableVisitor = new InMemoryConstantToVariableVisitor(); Expression expression = queryContext.CreateExpression(out IReadOnlyDictionary <ConstantExpression, ConstantNode> constants); expression = variableVisitor.Translate(expression, constants); expression = new OeSingleNavigationVisitor(queryContext.EdmModel).Visit(expression); expression = new OeCollectionNavigationVisitor(queryContext.EdmModel).Visit(expression); expression = new NullPropagationVisitor().Visit(expression); expression = queryContext.TranslateSource(dataContext, expression); var query = (Func <TResult>)Expression.Lambda(expression).Compile(); cacheContext = queryContext.CreateCacheContext(variableVisitor.ConstantToParameterMapper); executor = new InMemoryScalarExecutor <TResult>(query, variableVisitor.ParameterValues, variableVisitor.Parameters); base.QueryCache.AddQuery(cacheContext, (query, variableVisitor.Parameters), null, queryContext.EntryFactory); parameterValues = variableVisitor.ParameterValues; } else { executor = (InMemoryScalarExecutor <TResult>)queryCacheItem.Query; queryContext.EntryFactory = queryCacheItem.EntryFactory; parameterValues = cacheContext.ParameterValues; } lock (executor) { for (int i = 0; i < parameterValues.Count; i++) { executor[parameterValues[i].ParameterName] = parameterValues[i].ParameterValue; } return(executor.Execute()); } }