LINQ con métodos Extensores y expresiones lambda

LINQ es una serie de extensiones de lenguaje que admite la consulta de datos de forma segura. Está presente en la nueva versión de Visual Studio 2008. Los datos que se deben consultar pueden adoptar la forma de XML (LINQ sobre XML), bases de datos (ADO.NET habilitado para LINQ, que incluye LINQ sobre SQL, LINQ sobre Dataset y LINQ sobre Entidades), objetos (LINQ sobre Objetos), etc. La arquitectura de LINQ se muestra en la siguiente imagen.

En vez de añadir características específicas para el tratamiento de datos relacionales o XML a nuestros lenguajes de programación y motor de ejecución, con el proyecto LINQ hemos seguido un enfoque más general, y estamos añadiendo a .NET Framework facilidades de consulta de propósito general aplicables a todas las fuentes de información, y no solo a los datos relacionales o XML. Esta facilidad se llama ‘Consultas integradas en los lenguajes’ (Language Integrated Query - LINQ).

Utilizamos el término consultas integradas en los lenguajes para indicar que las consultas son una característica integrada del lenguaje de programación principal del desarrollador (por ejemplo C#, Visual Basic). Las consultas integradas en los lenguajes permiten que las expresiones de consulta se beneficien de los metadatos ricos, verificación de sintaxis en tiempo de compilación, tipado estático y ayuda IntelliSense que antes estaban disponibles solo para el código imperativo. Las consultas integradas en los lenguajes también hacen posible aplicar una única facilidad declarativa de propósito general a toda la información en memoria, y no solo a la información proveniente de fuentes externas.

Las consultas integradas en los lenguajes .NET definen un conjunto de operadores de consulta estándar de propósito general que hacen posible que las operaciones de recorrido, filtro y proyección sean expresadas de una manera directa pero declarativa en cualquier lenguaje de programación. Los operadores de consulta estándar permiten aplicar las consultas a cualquier fuente de información basada en IEnumerable<T>. LINQ permite que terceros fabricantes aumenten el conjunto de operadores de consulta estándar, añadiendo los operadores de dominio específico que sean apropiados para el dominio o la tecnología de destino. Más importante aún es que terceros fabricantes también pueden reemplazar los operadores de consulta estándar con sus propias implementaciones que ofrezcan servicios adicionales como la evaluación remota, traducción de consultas, optimización, etc. Al adherirse a los convenios del patrón LINQ, tales implementaciones gozarán de la misma integración en los lenguajes y soporte de herramientas que los operadores de consulta estándar.

La extensibilidad de la arquitectura de consultas es aprovechada por el propio proyecto LINQ para ofrecer implementaciones que operan sobre datos XML y SQL. Los operadores de consulta sobre XML (XLinq) utilizan una facilidad de XML en memoria interna eficiente y fácil de usar para ofrecer funcionalidad XPath/XQuery dentro del lenguaje de programación huésped. Los operadores de consulta sobre datos relacionales (DLinq) se apoyan en la integración de definiciones de esquemas basadas en SQL en el sistema de tipos del CLR. Esta integración ofrece un fuerte control de tipos sobre los datos relacionales, a la vez que mantiene la potencia expresiva del modelo relacional y el rendimiento de la evaluación de las consultas directamente en el almacén de datos subyacente.

LINQ está construido enteramente sobre características de los lenguajes de propósito general, algunas de las cuales son nuevas en C# 3.0 y Visual Basic 9.0. Cada una de estas características tiene su utilidad propia, pero conjuntamente, estas características ofrecen una manera extensible de definir consultas y API de consultas

Expresiones lambda y árboles de expresiones

Muchos operadores de consulta permiten al usuario suministrar una función que realice un filtrado, proyección o extracción de clave. Las facilidades de consulta se apoyan en el concepto de las expresiones lambda, que ofrecen a los desarrolladores una manera conveniente de escribir funciones que pueden ser pasadas como argumentos para su evaluación subsiguiente. Las expresiones lambda son similares a los delegados del CLR y deben adherirse a una firma de método definida por un tipo delegado. 

Métodos extensores

Las expresiones lambda son una parte importante de la arquitectura de consultas. Los métodos extensores son otra. Los métodos extensores combinan la flexibilidad del “tipado de pato” que han hecho populares los lenguajes dinámicos con el rendimiento y la validación en tiempo de compilación de los lenguajes de tipado estático. Mediante los métodos extensores, terceros fabricantes pueden aumentar el contrato público de un tipo con nuevos métodos, permitiendo a la vez a autores de tipos individuales ofrecer su propia implementación especializada de esos métodos.

Los métodos extensores se definen como métodos estáticos en clases estáticas, pero se marcan con el atributo [System.Runtime.CompilerServices.Extension] en los metadatos del CLR. Se propone que los lenguajes ofrezcan una sintaxis directa para los métodos extensores. En C#, los métodos extensores se indican mediante el modificador this aplicado al primer parámetro del método extensor 

La interfaz IQueryable

El mismo modelo de ejecución diferida es generalmente deseado para las fuentes de datos que implementan la funcionalidad de consultas mediante árboles de expresiones, como DLinq. Estas fuentes de datos pueden beneficiarse de implementar la interfaz IQueryable, para la cual todos los operadores de consulta requeridos por el patrón LINQ se implementan utilizando árboles de expresiones. Cada IQueryable tiene una representación de “el código necesario para ejecutar la consulta” en la forma de un árbol de expresión. Todos los operadores de consulta diferidos devuelven un nuevo IQueryable que aumenta ese árbol de expresión con una representación de una llamada a ese operador de consulta. Por esta razón, cuando llega el momento de evaluar la consulta, generalmente porque el IQueryable es enumerado, la fuente de datos puede procesar el árbol de expresión que representa a la consulta entera en un solo “lote”.  

Una vez entendido y leído toda esta parrafada, ha sido un copiar y pegar de la MSDN, paso a poner los ejemplos en real de los diferentes tipos de consulta que se pueden hacer con los métodos extensores:

 

Lo primero de todo he añadido a mi proyecto un “Linq To SQL” con esto te podrás crear tu modelo de objetos a través del modelo de base de datos que tengas en tu gestor de BBDD. El mío con el que hice las pruebas fue el siguiente:


[Ampliar Imagen]

Una de las posibles estructuras que debería tener una llamada a un método extensor sería esta:

 

XDataContext X = new XDataContext();

try

{

//Metodo Extensor

}

catch (Exception E)

{

throw (E);

}

finally

{

if (X != null)

{

X.Connection.Close();

X.Dispose();

}

}

Con esta estructura te aseguras que la conexión nunca se quedará colgada en memoria además de lanzarte la excepción. Otras posibles estructuras más simples a la hora de escribir sería utilizando la instrucción using.

Aclaraciones

  • Utilizaré IQueryable<T> ya que he añadido “Linq To SQL Classes, sino debería utilizar IEnumerable<T>.
  • String CodigoSolicitud = “A03E”;
  • Los métodos extensores nunca mandan una SQL con * en el select sino todos los campos con sinónimos.
LINQ con métodos Extensores y expresiones lambda
David Del Pino Corredor

David es un Analista/Programador que trabaja en una consultoria. En su experiencia laboral ha tratado con varias tecnologías especialmente con SQL Server 2005 y .NET.
Fecha de alta:03/04/2008
Última actualizacion:03/04/2008
Visitas totales:17172
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com