public IActionResult GetTodoItems([FromQuery] TodosResourceParameters todosResourceParameters) { var todosFromRepo = _taskRepository.GetTodoItems(todosResourceParameters); // genera el link de pagina previa en el paginado var previousPageLink = todosFromRepo.HasPrevious ? CreateTodosResourceUri(todosResourceParameters, ResourceUriType.PreviousPage) : null; // genera link de pagina siguiente en el paginado var nextPageLink = todosFromRepo.HasNext ? CreateTodosResourceUri(todosResourceParameters, ResourceUriType.NextPage) : null; // se generan los datos opcionales a mandar en Header var paginationMetadata = new { totalCount = todosFromRepo.TotalCount, pageSize = todosFromRepo.PageSize, currentPage = todosFromRepo.CurrentPage, totalPages = todosFromRepo.TotalPages, previousPageLink = previousPageLink, nextPageLink = nextPageLink }; Response.Headers.Add("X-Pagination", Newtonsoft.Json.JsonConvert.SerializeObject(paginationMetadata)); return(Ok(todosFromRepo)); }
/// <summary> /// obtiene el listado de Todos segun los filtros y la paginacion /// </summary> /// <param name="todosResourceParameters"></param> /// <returns></returns> public PagedList <TodoItem> GetTodoItems(TodosResourceParameters todosResourceParameters) { var collectionBeforePaging = _context.TodoItems .OrderBy(a => a.ID) .AsQueryable(); if (!string.IsNullOrEmpty(todosResourceParameters.Id.ToString())) { collectionBeforePaging = collectionBeforePaging .Where(a => a.ID == todosResourceParameters.Id); } if (!string.IsNullOrEmpty(todosResourceParameters.Descripcion)) { // trim & ignore casing var descriptionForWhereClause = todosResourceParameters.Descripcion .Trim().ToLowerInvariant(); collectionBeforePaging = collectionBeforePaging .Where(a => a.Descripcion.ToLowerInvariant() == descriptionForWhereClause); } if (!string.IsNullOrEmpty(todosResourceParameters.Estado)) { // trim & ignore casing var estadoForWhereClause = todosResourceParameters.Estado .Trim().ToLowerInvariant(); collectionBeforePaging = collectionBeforePaging .Where(a => a.Estado.ToLowerInvariant() == estadoForWhereClause); } return(PagedList <TodoItem> .Create(collectionBeforePaging, todosResourceParameters.PageNumber, todosResourceParameters.PageSize)); }
/// <summary> /// metodo de creacion de urls para paginado prev y next /// </summary> /// <param name="todosResourceParameters"></param> /// <param name="type"></param> /// <returns></returns> private string CreateTodosResourceUri( TodosResourceParameters todosResourceParameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(_urlHelper.Link("GetTodoItems", new { id = todosResourceParameters.Id, estado = todosResourceParameters.Estado, descripcion = todosResourceParameters.Descripcion, pageNumber = todosResourceParameters.PageNumber - 1, pageSize = todosResourceParameters.PageSize })); case ResourceUriType.NextPage: return(_urlHelper.Link("GetTodoItems", new { id = todosResourceParameters.Id, estado = todosResourceParameters.Estado, descripcion = todosResourceParameters.Descripcion, pageNumber = todosResourceParameters.PageNumber + 1, pageSize = todosResourceParameters.PageSize })); default: return(_urlHelper.Link("GetTodoItems", new { id = todosResourceParameters.Id, estado = todosResourceParameters.Estado, descripcion = todosResourceParameters.Descripcion, pageNumber = todosResourceParameters.PageNumber, pageSize = todosResourceParameters.PageSize })); } }