using Microsoft.EntityFrameworkCore; using RSecurityBackend.Models.Generic; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RSecurityBackend.Services.Implementation { /// /// Paginator /// public static class QueryablePaginator { /// /// paginate /// /// /// /// public static async Task<(PaginationMetadata PagingMeta, ArrayType[] Items)> Paginate(IQueryable source, PagingParameterModel paging) { // Get's No of Rows Count int count = source.Count(); // Parameter is passed from Query string if it is null then it default Value will be pageSize:20 int PageSize = paging.PageSize; // Parameter is passed from Query string if it is null then it default Value will be pageNumber:1 int CurrentPage = paging.PageNumber; // Display TotalCount to Records to User int TotalCount = count; // Calculating Totalpage by Dividing (No of Records / Pagesize) int TotalPages = PageSize <= 0 ? 1 : (int)Math.Ceiling(count / (double)PageSize); // Returns List of Customer after applying Paging var items = PageSize <= 0 ? source.ToList() : source.Skip((CurrentPage - 1) * PageSize).Take(PageSize).ToList(); // if CurrentPage is greater than 1 means it has previousPage bool previousPage = CurrentPage > 1; // if TotalPages is greater than CurrentPage means it has nextPage bool nextPage = CurrentPage < TotalPages; // Object which we are going to send in header PaginationMetadata paginationMetadata = new PaginationMetadata() { totalCount = TotalCount, pageSize = PageSize, currentPage = CurrentPage, totalPages = TotalPages, hasPreviousPage = previousPage, hasNextPage = nextPage }; ArrayType[] result = PageSize <= 0 ? await source.ToArrayAsync() : await source.Skip((CurrentPage - 1) * PageSize).Take(PageSize).ToArrayAsync(); return (paginationMetadata, result); } } }