Exemplo n.º 1
0
        private IAsyncEnumerable <TResult> GetFromCache <TResult>(OeQueryContext queryContext, DbContext dbContext, out MethodCallExpression?countExpression)
        {
            Cache.OeCacheContext   cacheContext   = queryContext.CreateCacheContext();
            Cache.OeQueryCacheItem?queryCacheItem = base.QueryCache.GetQuery(cacheContext);

            Func <QueryContext, IAsyncEnumerable <TResult> >   queryExecutor;
            IReadOnlyList <Cache.OeQueryCacheDbParameterValue> parameterValues;

            if (queryCacheItem == null)
            {
                var        parameterVisitor = new OeConstantToParameterVisitor();
                Expression expression       = queryContext.CreateExpression(parameterVisitor);
                expression = TranslateExpression(queryContext.EdmModel, expression);
                expression = queryContext.TranslateSource(dbContext, expression);
                expression = OeEnumerableToQuerableVisitor.Translate(expression);

                queryExecutor = dbContext.CreateAsyncQueryExecutor <TResult>(expression);
                if (queryContext.EntryFactory == null)
                {
                    countExpression = null;
                }
                else
                {
                    countExpression = queryContext.CreateCountExpression(expression);
                    countExpression = (MethodCallExpression)OeEnumerableToQuerableVisitor.Translate(countExpression);
                    countExpression = (MethodCallExpression)TranslateExpression(queryContext.EdmModel, countExpression);
                }

                cacheContext = queryContext.CreateCacheContext(parameterVisitor.ConstantToParameterMapper);
                base.QueryCache.AddQuery(cacheContext, queryExecutor, countExpression, queryContext.EntryFactory);
                parameterValues = parameterVisitor.ParameterValues;
            }
            else
            {
                queryExecutor             = (Func <QueryContext, IAsyncEnumerable <TResult> >)queryCacheItem.Query;
                queryContext.EntryFactory = queryCacheItem.EntryFactory;
                countExpression           = queryCacheItem.CountExpression;
                parameterValues           = cacheContext.ParameterValues;
            }

            var          queryContextFactory = dbContext.GetService <IQueryContextFactory>();
            QueryContext efQueryContext      = queryContextFactory.Create();

            foreach (Cache.OeQueryCacheDbParameterValue parameterValue in parameterValues)
            {
                efQueryContext.AddParameter(parameterValue.ParameterName, parameterValue.ParameterValue);
            }

            if (queryContext.IsQueryCount() && countExpression != null)
            {
                countExpression = (MethodCallExpression)queryContext.TranslateSource(dbContext, countExpression);
                countExpression = (MethodCallExpression) new OeParameterToVariableVisitor().Translate(countExpression, parameterValues);
            }
            else
            {
                countExpression = null;
            }

            return(queryExecutor(efQueryContext));
        }
Exemplo n.º 2
0
        public override IAsyncEnumerable <Object> Execute(Object dataContext, OeQueryContext queryContext)
        {
            IAsyncEnumerable <Object> asyncEnumerable;
            MethodCallExpression?     countExpression = null;

            if (base.QueryCache.AllowCache)
            {
                asyncEnumerable = GetFromCache <Object>(queryContext, (T)dataContext, out countExpression);
            }
            else
            {
                Expression expression = queryContext.CreateExpression(new OeConstantToVariableVisitor());
                expression = OeEnumerableToQuerableVisitor.Translate(expression);
                expression = TranslateExpression(queryContext.EdmModel, expression);
                IQueryable entitySet = queryContext.EntitySetAdapter.GetEntitySet(dataContext);
                IQueryable query     = entitySet.Provider.CreateQuery(queryContext.TranslateSource(dataContext, expression));
                asyncEnumerable = ((IQueryable <Object>)query).AsAsyncEnumerable();

                if (queryContext.IsQueryCount())
                {
                    expression      = queryContext.CreateCountExpression(query.Expression);
                    countExpression = (MethodCallExpression)OeEnumerableToQuerableVisitor.Translate(expression);
                    countExpression = (MethodCallExpression)TranslateExpression(queryContext.EdmModel, countExpression);
                }
            }

            if (countExpression != null)
            {
                IQueryable query = queryContext.EntitySetAdapter.GetEntitySet(dataContext);
                queryContext.TotalCountOfItems = query.Provider.Execute <int>(countExpression);
            }

            return(asyncEnumerable);
        }
Exemplo n.º 3
0
        public override TResult ExecuteScalar <TResult>(Object dataContext, OeQueryContext queryContext)
        {
            if (base.QueryCache.AllowCache)
            {
                return(Infrastructure.AsyncEnumeratorHelper.GetResult(GetFromCache <TResult>(queryContext, (DbContext)dataContext, out _).SingleAsync()));
            }

            IQueryable query      = queryContext.EntitySetAdapter.GetEntitySet(dataContext);
            Expression expression = queryContext.CreateExpression(new OeConstantToVariableVisitor());

            expression = OeEnumerableToQuerableVisitor.Translate(expression);
            expression = TranslateExpression(queryContext.EdmModel, expression);
            return(query.Provider.Execute <TResult>(queryContext.TranslateSource(dataContext, expression)));
        }