ADO.NET Data Services : Paginación

En este post voy a hacer un ejemplo de cómo paginar resultados de una consulta realizada a través de ADO.NET Data Services y aprovechando la funcionalidad que se provee a partir de la versión v1.5CTP1.  La paginación en la consumición de servicios es una buena práctica, ya que traemos en segmentos los datos que vamos a traernos y, así, tanto cliente como servidor, pueden ir procesando al mismo tiempo tanto lo que va a servir como lo que se va a consumir.

En este ejemplo contamos con dos entidades Master y Slave, Master tiene una propiedad de navegación hacia Slave de uno a muchos.

Bien, la paginación en ADO.NET Data Services se hace a nivel de Entidad de nuestro modelo, por lo que en el método InitializeService de nuestro servicio utilizaremos el método SetEntitySetPageSize para especificar el tamaño máximo de página para un EntitySet dado o, lo que es lo mismo, el número máximo de entidades de ese tipo que viajarán en un lote por el servicio. El código sería el siguiente:

config.SetEntitySetPageSize(“Master”, 10);

Será diez el tamaño máximo de página. Tampoco tenemos que olvidar que la versión de protocolo de Data Services tiene que ser la V2, cosa que también especificaremos en el método InitializeService de nuestro servicio la siguiente manera:

config.DataServiceBehavior.MaxProtocolVersion = System.Data.Services.Common.DataServiceProtocolVersion.V2;

Siendo config un objeto de tipo DataServiceConfiguration que el método InitializeService recibe por parámetro y que ya todos conocemos.

Ahora vamos a crear el código de la llamada en cliente, en el que vamos a rellenar una lista de entidades Master de manera paginada con sus entidades Slave relacionadas:

List<Master> masterList = new List<Master>();

DataServiceQueryContinuation<Master> token = null;

QueryOperationResponse<Master> response = context.Master

                                  .Expand(“Slave”)

                                  .Execute() as QueryOperationResponse<Master>;

          do

            {

         if (token != null)

                {

                    response = context.Execute<Master>(token) as QueryOperationResponse<Master>;

                }

                masterList.AddRange(response);

            } while ((token = response.GetContinuation())  != null);

 

Explicado un poco el código, utilizaremos un objeto de la nueva clase DataServiceQueryContinuation para paginar nuestra petición, casteando la ejecución de la query al tipo QueryOperationResponse y materializando la consulta con response.ToList(). Posteriormente, recuperaremos el siguiente DataServiceQueryContinuation con diez entidades Master más. Cuando el objeto response no pueda suministrar más DataServiceQueryContinutation en las que viajan cada una de las páginas de nuestra consulta, devolverá null y significará que nuestra consulta se ha materializado por completo, por lo que la lista masterList quedará rellena con todas las entidades Master de nuestro almacen relacional. En cada iteración del while podríamos observar como su número de elementos aumenta de diez en diez.

Con este tipo de paginación se consigue que el cliente procese una cantidad estipulada de entidades mientras el servicio le suministra las siguientes, manteniendo un nivel de consumo de recursos del sistema adecuado, tanto en cliente como en servidor. También es una buena técnica para evitar límites de tamaño de mensaje servido por el servicio o Time outs.

Pero también se puede utilizar para paginación visual, con la que conseguiremos sólo consumir lo que va a ser mostrado y no materializar toda la consulta, con entidades que no van a ser utilizadas. Para lo que utilizaríamos los típicos controles de navegación de páginas.

Algo a tener en cuenta es que, así configurado el servicio, cualquier consulta sobre ese EntitySet recuperará solo diez entidades, ya sea esa consulta paginada o no.

2 comentarios en “ADO.NET Data Services : Paginación”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *