Hola a todos, en esta entrada quiero mostrar una de las técnicas que podemos utilizar para realizar páginación en ASP Web API, dicha técnica consiste en retonar en el resultado la información necesaria de la paginación, es decir, en el resultado vamos a tener:

  • Cantidad total de resultados
  • Total de páginas
  • Página actual
  • Información de resultados parciales


Para este ejemplo, vamos a utilizar un modelo bastante sencillo, solo una clase llamada Customer como la siguiente:


public class Customer
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string LastName { get; set; }

    public string Email { get; set; }
}

En este caso, haremos uso de Entity Framework Code First para crear la base de datos y añadir inicialmente 100 registros (al final encontrarás todo el código para que puedas verlo).

Adicionalmente, tenemos una clase CustomPaginateResult que será la encargada de retonar la información, en dicha clase tenemos la información de la páginación y el conjunto de resultados, para que sea útil para cualquier entidad la crearemos de forma genérica:


public class CustomPaginateResult<T> where T : class 
{
    public int CurrentPage { get; set; }

    public int PageSize { get; set; }

    public int TotalRows { get; set; }

    public int TotalPages { get; set; }

    public IEnumerable<T> Results { get; set; }
}

Ahora, vamos a la parte importante, vamos a crear un controlador de Web API llamado CustomerController, con un método GetCustomer, dicho método va a recibir cómo parámetro la página a mostrar y el número de resultados por página:



public class CustomerController : ApiController
{
    private readonly AppContext context = new AppContext();

    [ResponseType(typeof(CustomPaginateResult<Customer>))]
    public IHttpActionResult GetCustomers(int page, int rows)
    {
        var totalRows = context.Customers.Count();
        var totalPages = (int) Math.Ceiling((double) totalRows/rows);
        var results = context.Customers
            .OrderBy(c => c.Id)
            .Skip((page)*rows)
            .Take(rows)
            .ToList();

        var result = new CustomPaginateResult<Customer>()
        {
            PageSize = rows,
            TotalRows = totalRows,
            TotalPages = totalPages,
            CurrentPage = page,
            Results = results
        };

        return Ok(result);
    }
}

En el cuerpo del método, básicamente lo que hacemos es:

  • Obtener el total de resultados
  • Calcular el número de páginas a mostrar
  • Obtener los resultados parciales, en este caso usando Skip y Take
  • Crear y retornar una instancia de la clase CustomPaginateResult

Ahora, para validar el funcionamiento, haré uso de Fiddler:

alt

Ahora solo falta crear el cliente para consumir el API, para el ejemplo, he implementado una sencilla aplicación Web en ASPNET MVC apoyada con Knockoutjs para el binding:

alt

Puedes ver el código en Código en GitHub o el demo en: Demo Web Api Simple Pagination

En los próximos post seguiremos viendo otras opciones par implementar paginación en ASPNET Web API.

Saludos!