Пример #1
0
        public static void AddPaginationHeader <T>(this Controller controller,
                                                   IResourceParameter parameters, IPagedResult <T> result, IUrlHelper urlHelper)
        {
            var actionName = controller.ControllerContext.ActionDescriptor.AttributeRouteInfo.Name;
            var attributes = new[]
            {
                nameof(parameters.PageNumber).PascalToCamelCase(),
                nameof(parameters.PageSize).PascalToCamelCase()
            };

            var prevPage = result.HasPrevious ? urlHelper.Link(actionName, new Dictionary <string, string>
            {
                { attributes[0], (result.PageNumber - 1).ToString() },
                { attributes[1], result.PageSize.ToString() }
            }.AddRange(parameters.GetPageHeader())) : null;

            var nextPage = result.HasNext ? urlHelper.Link(actionName, new Dictionary <string, string>
            {
                { attributes[0], (result.PageNumber + 1).ToString() },
                { attributes[1], result.PageSize.ToString() }
            }.AddRange(parameters.GetPageHeader())) : null;

            var metaData = new
            {
                currentPage      = result.PageNumber,
                pageSize         = result.PageSize,
                totalPages       = result.TotalPages,
                totalCount       = result.TotalCount,
                previousPageLink = PercentEncodeReplace.Replace(prevPage),
                nextPageLink     = PercentEncodeReplace.Replace(nextPage)
            };

            controller.Response.Headers.Add("X-Pagination", Newtonsoft.Json.JsonConvert.SerializeObject(metaData));
        }
Пример #2
0
        public static IQueryable <T> ApplyFilters <T>(this IQueryable <T> source, IResourceParameter <T> param)
        {
            if (source == null)
            {
                throw new ArgumentException($"{ nameof(source) }");
            }

            return(((IInternalResourceParameter <T>)param).ApplyFilters(source));
        }
Пример #3
0
        public static IPagedResult <T> ToPagedResult <T>(this IQueryable <T> source, IResourceParameter <T> param)
        {
            int count   = source.Count();
            int pageNum = GetPageNum(count, param.PageSize, param.PageNumber);

            var items = source.Skip((pageNum - 1) * param.PageSize).Take(param.PageSize).ToList();

            return(new PagedResult <T>(items, pageNum, param.PageSize, count));
        }
Пример #4
0
        public static IQueryable <T> ApplyOrderBy <T>(this IQueryable <T> source, IResourceParameter <T> param)
        {
            if (source == null)
            {
                throw new ArgumentException($"{ nameof(source) }");
            }


            source = ((IInternalResourceParameter <T>)param).ApplyOrderBy(source);
            return(source);
        }
Пример #5
0
        public static async Task <IPagedResult <T> > ToPagedResultAsync <T>(this IQueryable <T> source,
                                                                            Func <IQueryable <T>, Task <int> > CountAsync,
                                                                            Func <IQueryable <T>, Task <List <T> > > ToListAsync,
                                                                            IResourceParameter <T> param)
        {
            int count = await CountAsync(source);

            int pageNum = GetPageNum(count, param.PageSize, param.PageNumber);
            var test    = source.Skip((pageNum - 1) * param.PageSize).Take(param.PageSize);
            var items   = await ToListAsync(test);

            return(new PagedResult <T>(items, pageNum, param.PageSize, count));
        }
Пример #6
0
        public async Task <IActionResult> GetUsers(IResourceParameter <User> param)
        {
            //Gets data from database
            var usersDb = await _unitOfWork.Users.GetAsync(param);

            //var users = _mapper.Map<IEnumerable<User>, IEnumerable<UserDto>>(usersDb);


            //Adds Paginationheader to response
            this.AddPaginationHeader(param, usersDb, _urlHelper);

            //Shapes data on return.
            return(Ok(usersDb.ShapeData(param)));
        }
Пример #7
0
 public static IQueryable <T> ApplyIncludes <T>(this IQueryable <T> source,
                                                Func <IQueryable <T>, string, IQueryable <T> > Include, IResourceParameter <T> param)
 {
     if (source == null)
     {
         throw new ArgumentException($"{ nameof(source) }");
     }
     return(Include == null ? source : ((IInternalResourceParameter <T>)param).ApplyExpand(source, Include));
 }
Пример #8
0
        public static IEnumerable <object> ShapeData <TEntity>(this IEnumerable <TEntity> source, IResourceParameter param)
        {
            if (source == null)
            {
                throw new ArgumentNullException($"{nameof(source)}");
            }

            var internalParam = (IInternalResourceParameter <TEntity>)param;

            return(internalParam.ApplySelect(source));
        }
Пример #9
0
        public async Task <IPagedResult <T> > GetAsync(IResourceParameter <T> parameters)
        {
            var collection = Context.Set <T>().ApplyIncludes((q, i) => q.Include(i), parameters).ApplyFilters(parameters).ApplyOrderBy(parameters);

            return(await collection.ToPagedResultAsync(async q => await q.CountAsync(), async q => await q.ToListAsync(), parameters));
        }
Пример #10
0
        public IPagedResult <T> Get(IResourceParameter <T> parameters)
        {
            var collection = Context.Set <T>().ApplyFilters(parameters);

            return(collection.ToPagedResult(parameters));
        }