Creamos nuestra clase de Paginación
namespace Api.Core.Custom
{
public class PaginatedList<T> : List<T>
{
public int PageIndex { get; set; }
public int TotalPages { get; private set; }
public int PageSize { get; set; }
public int TotalCount { get; set; }
public bool HasPreviousPage{
get{
return (PageIndex > 1);
}
}
public bool HasNextPage{
get{
return (PageIndex < TotalPages);
}
}
public int? NextPageNumber => HasNextPage ? PageIndex + 1 : (int?)null;
public int? PreviousPageNumber => HasPreviousPage ? PageIndex - 1 : (int?)null;
public PaginatedList(List<T> items, int count, int pageIndex, int pageSize)
{
TotalCount = count; //Total de Registros
PageIndex = pageIndex; //Pagina actual en la que estamos
PageSize = pageSize; //Total de registros por Pagina
TotalPages = (int)Math.Ceiling(count / (double)pageSize); //Total de paginas
this.AddRange(items);
}
public static PaginatedList<T> Create(IEnumerable<T> source, int pageIndex, int pageSize)
{
var count = source.Count();
var items = source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
return new PaginatedList<T>(items, count, pageIndex, pageSize);
}
}
}
namespace Api.Core.Custom
{
public class Metadata
{
public int TotalCount { get; set; } //Total de registros
public int PageIndex { get; set; } //Pagina Actual
public int PageSize { get; set; } //Numero de registros por Pagina
public int TotalPages { get; set; } //Total de paginas (TotalCount/PageSize)
public bool HasPreviousPage { get; set; } //True = Si existe pagina anterior
public bool HasNextPage { get; set; } //False = Si existe pagina siguiente
}
}
namespace Api.Core.Response
{
public class ApiResponseSuccess<T>
{
public ApiResponseSuccess(T success)
{
Success = success;
}
public T Success { get; set; }
public Metadata Pagination { get; set; }
}
}
En el Service
public async Task<PaginatedList<MesaDto>> GetAll(FiltersQuery filters)
{
var responseModel = await _mesaRepository.GetAll();
if (filters.Descripcion != null)
{
responseModel = responseModel.Where(x => x.Descripcion.ToLower().Contains(filters.Descripcion.ToLower()));
}
var responseDto = _mapper.Map<IEnumerable<MesaDto>>(responseModel); //Mappeamos de MesaModel a MesaDto
var paginatedResponse = PaginatedList<MesaDto>.Create(responseDto, filters.PageIndex, filters.PageSize);
return paginatedResponse;
}
En el Controller
[HttpGet]
public async Task<IActionResult> GetAll([FromQuery] FiltersQuery filters)
{
var response = await _mesaService.GetAll(filters);
var metadata = new Metadata {
TotalCount = response.TotalCount, //Cuanto registros tengo
PageIndex = response.PageIndex, //En que pagina actual estamos
PageSize = response.PageSize, //Cuantos registros por pagina
TotalPages = response.TotalPages, //total de paginas (TotalCount/PageSize)
HasNextPage = response.HasNextPage, //True = Si existe una pagina Siguiente
HasPreviousPage = response.HasPreviousPage //True = Si existe una pagina anterior
};
var apiResponse = new ApiResponseSuccess<IEnumerable<MesaDto>>(response)
{
Pagination = metadata //Agreaganmos nuestra pagination en el JsonResultado
}; //Retornamos nuestro response
Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(metadata));
return Ok(apiResponse);
}