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());
            }
        }