Dynamic LINQ o como construir consultas dinámicas con LINQ!

Una de las preguntas más típicas que surgen cuando he impartido algún seminario en el que se trata algún tema de LINQ es como se pueden construir consultas dinámicas con LINQ, porque aparentemente LINQ no parece admitir este escenario puesto que la idea es escribir lo que el genial (uno de los grandes "culpables" de el diseño y creación de LINQ)  Scott Guthrie denomina consultas "type-safe", es decir, consultas en las que tenemos soporte para intellisense, refactoring y comprobación de tipos en tiempo de compilación...pero, que pasa (escenario bastante habitual) si necesito una cierta flexibilidad que implique poder construir consultas más o menos dinámicas (por ejemplo, realizar consultas cambiantes en función de los datos de negocio seleccionados por el usuario de una cierta aplicación)...la clave está en la palabra "aparentemente", puesto que como viene siendo habitual en los últimos tiempos, LINQ y las innovaciones en el lenguaje proporcionan los elementos adecuados para construir estas consultas dinámicas. En este caso estamos hablando de la LINQ Dynamic Query Library (System.Linq.Dynamic), de la que tenemos ejemplos de uso en la página de ejemplos descargables de VS 2008, o bien:

Si nos bajamos cualquiera de los archivos de los vínculos anteriores, veremos que se trata de un conjunto de ejemplos sobre LINQ, siendo uno de los mismos el de Dynamic Query. Al abrir la solución, podremos ver que aparte de hacer referencia a la librería comentada (y que es una clase del proyecto de ejemplo que podemos usar), la construcción de una consulta LINQ dinámica tendría la siguiente forma:

Northwind db = new Northwind(connString);
db.Log = Console.Out;

var query =
    db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
    OrderBy("CompanyName").
    Select("New(CompanyName as Name, Phone)");

Como vemos, la clave está basada en la definición de expresiones tipo cadena, en lugar de código...¿y cómo es posible esto? Pues a través de una serie de métodos de extensión que permiten construir consultas en base a expresiones en cadena en lugar de las habituales expresiones lambda. Junto con el ejemplo de uso e la Dynamic Query Library viene algo de documentación sobre como utilizarla. Finalmente, comentaros que se puede utilizar para cualquier extensión de LINQ: LiNQ To Objects, LINQ To SQL, LINQ To XML, ...



29-01-2008 - Creado por: Juan Carlos Gonzalez - Categoría: LINQ; Visual Studio 2008 - Comentarios:
Copyright © 2010 CIIN |  Aviso Legal |  Contacta con Nosotros Facebook  Geeks.ms
Inicio - Blog