12.30.2012

QueryInterceptors en WCF Data Services

Los QueryInterceptors son atributos que nos permiten personalizar la forma en que se llevan a cabo las consultas utilizando WCF Data Services – aunque en realidad sirven para muchas otras cosas más. Creando un servicio para consumirlo desde un dispositivo móvil utilice estos atributos para llevar a cabo una tarea de consulta de forma sencilla utilizando WCF Data Services y utilizando notación JSON. El escenario lo describo a continuación.

Resulta que tengo un conjunto de registros pero solo necesito los registros que tienen una propiedad especifica seteada con un valor especifico. En WCF Data Services esto implica hacer una consulta en Linq y proceder con el filtro. Sin embargo utilizando los QueryInterceptors ya no es necesario crear la consulta en Linq del lado del cliente y puedo proceder directamente desde el servicio. Para ilustrar este caso vamos a ir con un ejemplo.

Supongamos que tenemos una tabla de películas con todas las películas del año, tal y como se ve en la figura ( datos de ejemplo por supuesto )

image

Ahora bien, resulta que la aplicación móvil solo debe de desplegar las películas que están en cartelera, es decir EnCines = 0. Para llevar a cabo esta tarea, hice un WCF Data Services y le configuré el modelo del Entity Framework para que pueda devolver las entidades. Si no agregamos ningún método o un QueryInterceptor, entonces vamos a poder filtrar utilizando un browser y modificando el query string, o creando un cliente y utilizando Linq. Sin embargo, como ya sabía que requería solo las películas que estaban en el cine proyectándose, procedí a crear un interceptor que me permita devolver solo las películas cuya Propiedad EnCines = 0.

image

Como se ve en la figura anterior, el QueryInterceptor es un atributo que se le aplica al conjunto de registros que se específica en el atributo, en este caso “Películas”. Seguidamente procedemos a crear una Expresión de Linq en donde establecemos que esa expresión recibe Película y retorna un booleano. Luego con una expresión lambda procedemos a aplicar la comparación deseada.

Como vemos en la siguiente figura, la consulta inicial solo nos retorna los registros de las películas que tienen el atributo EnCines = 0.

image

Etiquetas de Technorati: ,