public virtual async Task <IEnumerable <TResource> > GetAsync()
        {
            _hookExecutor?.BeforeRead <TResource>(ResourcePipeline.Get);

            var entityQuery = _repository.Get();

            entityQuery = ApplyFilter(entityQuery);
            entityQuery = ApplySort(entityQuery);
            entityQuery = ApplyInclude(entityQuery);
            entityQuery = ApplySelect(entityQuery);

            if (!IsNull(_hookExecutor, entityQuery))
            {
                var entities = await _repository.ToListAsync(entityQuery);

                _hookExecutor.AfterRead(entities, ResourcePipeline.Get);
                entityQuery = _hookExecutor.OnReturn(entities, ResourcePipeline.Get).AsQueryable();
            }

            if (_options.IncludeTotalRecordCount)
            {
                _pageService.TotalRecords = await _repository.CountAsync(entityQuery);
            }

            // pagination should be done last since it will execute the query
            var pagedEntities = await ApplyPageQueryAsync(entityQuery);

            return(pagedEntities);
        }
        /// <inheritdoc />
        public virtual async Task <IReadOnlyCollection <TResource> > GetAsync()
        {
            _traceWriter.LogMethodStart();

            _hookExecutor?.BeforeRead <TResource>(ResourcePipeline.Get);

            if (_options.IncludeTotalResourceCount)
            {
                var topFilter = _queryLayerComposer.GetTopFilter();
                _paginationContext.TotalResourceCount = await _repository.CountAsync(topFilter);

                if (_paginationContext.TotalResourceCount == 0)
                {
                    return(Array.Empty <TResource>());
                }
            }

            var queryLayer = _queryLayerComposer.Compose(_request.PrimaryResource);
            var resources  = await _repository.GetAsync(queryLayer);

            if (_hookExecutor != null)
            {
                _hookExecutor.AfterRead(resources, ResourcePipeline.Get);
                return(_hookExecutor.OnReturn(resources, ResourcePipeline.Get).ToArray());
            }

            if (queryLayer.Pagination?.PageSize != null && queryLayer.Pagination.PageSize.Value == resources.Count)
            {
                _paginationContext.IsPageFull = true;
            }

            return(resources);
        }
Example #3
0
        public void BeforeReadSingle <TResource, TId>(TId id, ResourcePipeline pipeline)
            where TResource : class, IIdentifiable <TId>
        {
            var temporaryResource = _resourceFactory.CreateInstance <TResource>();

            temporaryResource.Id = id;

            _resourceHookExecutor.BeforeRead <TResource>(pipeline, temporaryResource.StringId);
        }
        public virtual async Task <IReadOnlyCollection <TResource> > GetAsync()
        {
            _logger.LogTrace($"Entering {nameof(GetAsync)}().");

            _hookExecutor?.BeforeRead <TResource>(ResourcePipeline.Get);

            if (_options.IncludeTotalResourceCount)
            {
                var topFilter = _queryLayerComposer.GetTopFilter();
                _paginationContext.TotalResourceCount = await _repository.CountAsync(topFilter);
            }

            var queryLayer = _queryLayerComposer.Compose(_currentRequest.PrimaryResource);
            var resources  = await _repository.GetAsync(queryLayer);

            if (_hookExecutor != null)
            {
                _hookExecutor.AfterRead(resources, ResourcePipeline.Get);
                return(_hookExecutor.OnReturn(resources, ResourcePipeline.Get).ToList());
            }

            return(resources);
        }