Dynamic LINQ(Parte 1: Usando la librería de LINQ Dynamic)

LINQ (language integrated query) es una de las nuevas características que trae VS 2008 y .NET 3.5. LINQ hace que el concepto de consultar datos esté muy ligado a la programación en .NET, y nos permite expresar consultas en el lenguaje que elijamos de la plataforma.

Uno de los beneficios de LINQ es que nos permite escribir consultas type-safe en VB y C#. De manera que en tiempo de compilación disponemos de chequeo de esas consultas, e intellisens y soporte de refactoring en el código:

Aunque este tipo de consultas vienen bien para la mayoría de escenarios, en algunos casos queremos tener la flexibilidad de crear consultas dinámicamente. Por ejemplo: queremos exponer cierta lógica de negocio en la capa de presentación de manera que presente una serie de desplegables para que el usuario exprese la consulta que quiere realizar.

Normalmente este tipo de escenarios son resueltos concatenando cadenas de caracteres para crear una consulta SQL. Recientemente unas cuantas personas me han preguntado cómo usar LINQ en estos escenarios. El siguiente post veremos cómo usar la librería Dynamic Query del equipo de LINQ para crear consultas dinámicas con LINQ.

Descargar la librería LINQ Dynamic Query

En la página de descarga de ejemplos de VS 2008 hay enlaces directos a paquetes de ejemplo en VB y C# que incluyen una librería de ayuda de consultas dinámicas con LINQ. Aquí los tenéis:

  • VB Dynamic Query Library (included in the Language SamplesLINQ SamplesDynamicQuery directory)
  • C# Dynamic Query Library (included in the LinqSamplesDynamicQuery directory)
  • Ambos paquetes incluyen una implementación de una librería que nos permitirá expresar consultas LINQ con métodos de extensión que tienen como argumento una cadena en lugar de los operadores de tipos seguros del lenguaje. Podéis hacer copy/Paste de las implementaciones de la librería DynamicQuery en vuestros proyectos y usarla.

    Ejemplo de Dynamic Query Library

    Podéis usar esta libreria contra cualquier proveedor de datos LINQ ( incluyendo LINQ to SQL, LINQ to Objects, LINQ to XML, LINQ to Entities, LINQ to SharePoint, LINQ to TerraServer, etc). En lugar de usar operadores del lenguaje o metodos de extensión con tipos seguros lambda para crear las consultas, esta librería nos aporta una serie de métodos de extensión que nos permiten pasarles una cadena con cualquier expresion.

    Por ejemplo, aquí tenémos una consulta estándar de LINQ to SQL en VB que obtiene datos de la base de datos Northwind y muestra el resultado en un control GridView de ASP.NET:

    Con la librería DynamicQuery podríamos reescribir lo anterior de la siguiente forma:

    Fijáos cómo el condicional where y la sentencia orderby ahora tienen como parámetros unos strings. De esta manera podríamos poner en la interfaz de usuario  una forma más cómoda de crear consultas (incluso sentencias arbitrarias).

    Documentación de la Dynamic Query Library.

    En los ejemplos anteriores hay alguna documentación HTML que describen cómo usar los métodos de extensión de la Dynamic Query Library con más detalle:

    Descargar y ejecutar los ejemplos

    Podéis descargar y ejecutar los ejemplos que comentabamos y verlos funcionar en un sitio web con ASP.NET conta la base de datos Northwind usando LINQ to SQL:

  • Basic Dynamic LINQ VB Sample
  • Basic Dynamic LINQ C# Sample
  • Podéis usar tanto Visual Web Developer 2008 Expres como VS 2008 para abrirlos y ejecutarlos.

    Otras formas de crear consultas LINQ dinámicas

    Usar esta librería es muy simple y fácil de usar, y es muy útil en escenarios donde las consultas son totalmente dinámicas y queréis ayudar al usuario final a crearlas.

    En próximos post veremos más en detalle este tema, y veremos otras formas de estructurar el código predicados de métodos con tipos seguros (Joseph y Ben Albahari, autores del libre C# 3.0 In a Nutshell, tiene un post listo aquí).

    Espero que sirva.

    Scott.

    Traducido por: Juan María Laó Ramos. Microsoft Student Partner.

    Artículo original.

    9 pensamientos en “Dynamic LINQ(Parte 1: Usando la librería de LINQ Dynamic)

    1. Fernando Lescano

      Hola Juan Maria,
      Gracias por traducir el post original.
      Estoy usando el Dynamic LinQ, y no encuentro la forma de hacer:
      .Where (myWhereString)
      donde
      string myWhereString = “Company = ‘Microsoft'”;
      sabes como puedo implementarlo??
      Gracias

      Responder
      1. Estyfen

        Debes enviarlo como Array de Parámetros de la siguiente manera

        where(“codigo=@0 and nombre=@1″, ParamArray() ‘001’,’Estyfen’ )

        Responder
        1. Estyfen

          Disculpa todo lo anterior pero el = es ==

          where(”codigo==@0 and nombre==@1″, ParamArray() ‘001′,’Estyfen’ )

          Responder
    2. Diego

      Hola

      Tengo problemas al incluir la clase DynamicLinq.vb.

      Me di cuenta que al agregar esta clase a un WebApplication (q es lo q yo tengo) todos los demas namespaces (ej: Inherits System.Web.UI.Page) de los webForms lanzan errores. Este problema no se da cuando trabajas con un WebSite.

      Q debo hacer para poder utilizar esta clase?, me puedes orientar?.
      PD: No puedo cambiar de WebApplication a WebSite por q ya esta en producción la solucion.

      Gracias

      Responder
    3. Paloma

      Tengo el mismo problema que Diego, incluso los ejemplos no me funcionan. Por ejemplo el propio imports lanza un error. Se supone que el ejemplo debería funcionar sin más. Estoy en Visual Studio 2008 Developer Team . Me gustaría saber si alguien pudo solucionar este problema.

      Responder
    4. Pingback: LINQ Dynamic Query | 3Engine

    5. vale

      Estimado, ¡muchas gracias por el artículo!
      Quería saber si hay alguna forma de sustituir al let en dynamic linq. Tengo una clase, la cual persisto, que tiene un atributo que es una lista de objetos de otra clase, la cual también persisto. Con linq la consulta sería:

      return m in contexto.SetMensajes
      let atrs = m.Atributos
      from a in atrs
      where a.Nombre == nombre
      select m

      ¿Puedo hacer esto con dynamic linq? He estado buscando pero no encuentro nada.

      ¡Gracias!

      Saludos

      Responder

    Deja un comentario