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, …

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

3 comentarios en “Dynamic LINQ o como construir consultas dinámicas con LINQ!”

  1. Hola, Juan Carlos!

    Perdón por el “comercial”. En mi libro “C# 3.0 y LINQ” se habla sobre esa API, se mencionan sus inconvenientes y se presenta un ejemplo.

    Saludos – Octavio

  2. Hola Octavio!
    Gracias por el apunte…ahora además de la referencia al blog de Scott Guthrie podré dar la de tu libro, que por otro lado tendré que leer para adquirir una mejor visión de lo que sobre LINQ en general estoy aprendiendo.

    Gracias

    JC’s

Deja un comentario

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