viernes, 25 de octubre de 2013

Introducción a LinQ


Language Integrated Query (Consultas integradas en el lenguaje) es un set de librerías de Microsoft .Net Framework para trabajar con data sources. LinQ proporciona una capa de abstracción entre los lenguajes de .NET y cada vez más fuentes de datos subyacentes.

LinQ proporciona a los desarrolladores una forma de consultar datos con un lenguaje muy similar al utilizado en sus desarrollos, principalmente C# o VB.NET. 


Recuerda que aquí tienes el indice de todos los posts del Curso de LinQ.

Quitándonos de formalismos, LinQ, puede ser que sea uno de los lanzamientos más importantes de los últimos tiempos en el mundo del desarrollo. A nivel personal, LinQ es una de esas partes que adoptas de forma rapidísima y que hacen que tu productividad, limpieza de código y facilidad de desarrollo aumenten exponencialmente. Cuando lo usas a diario, cuesta mucho imaginarse un día a día sin él, y mucho menos un cambio de tecnología.

LinQ ha sido uno de esos avances que han hecho que Microsoft gane una serie enteros sobre su competencia facilitando a raudales la vida del desarrollador.

LinQ fue desarrollado para versión 3.0 del .NET Framework, pudiéndose instalar como extensión sobre Visual Studio 2005, aunque no fue hasta la aparición de Visual Studio 2008 y el .NET Framework 3.5 que vino de inicio con su instalación estándar.

LinQ se ha convertido en algo tan común en un desarrollo de .NET, que esté añade el using de su librería para prácticamente el 100% de los tipos de proyectos contenidos en las plantillas de Visual Studio.

LinQ está disponible en una serie de sabores diferentes:

  • Linq To Objects
  • Linq To SQL
  • Linq To Entities
  • Linq To DataSets
  • Linq To XML



Todos ellos desarrollados por Microsoft, aunque gracias a las capacidades de extensión de las que goza hay un gran número de implementaciones de terceros:

  • Linq to ADO.NET Data Services
  • Linq to OLAP cubes in SSAS.
  • Linq to Google.
  • Linq to MySQL
  • Linq to PostgreSQL
  • Linq to NHibernate
  • Linq to DataObjects
  • Linq to db4o
  • Linq to Twitter
  • Linq to Wikipedia
  • Y un largo etc.
Nosotros nos centraremos principalmente en el primero de todos LinQ to Objects, ya que este es la base para todos los demás.

La idea es intentar empezar desde cero, pero dando una visión interna de la implementación para conseguir tener un control sobre las técnicas y su funcionamiento interno y no basarnos simplemente en la analogía de lanzar una query a objetos de datos en memoria como si fuera una sentencia SQL. Me gustaría que todos los niveles de usuarios, tanto los que nunca han visto nada, los que utilizan consultas de forma esporádicas o los más avanzados, saquen jugo a esta serie de posts sobre LinQ. Para todo esto, empezaremos sobre las bases sobre las que se apoya la tecnología y que no forman parte de las librerías de LinQ, pero son esenciales a la hora de comprender su uso y elevarse hacía las partes más avanzadas del mismo.

Nuestra primera consulta de LinQ.


Code:
/// Expresión Lambda
var personasConNombreEmpiezaPorA = Persona.DevolverPersonas().Where(p => p.Nombre.StartsWith("A"));
 
/// Expresión de Consulta
var personasConNombreEmpiezaPorA = from p in Persona.DevolverPersonas()
                                   where p.Nombre.StartsWith("A")
                                   select p;


Como podemos observar tenemos 2 formas de expresar nuestras consultas en LinQ:
  1.        Expresión Lambda: Es la forma más cercana al lenguaje puro de realizar la consulta y utiliza la nomenclatura y forma de hacer de la llamada programación funcional.
  2.        Expresión de Consulta: Es una composición de la primera opción envuelta en el llamado ‘azúcar sintáctico’ que facilita la lectura y escritura para todos los desarrolladores provenientes del mundo SQL. Como se puede apreciar utiliza prácticamente la misma estructura de una consulta de SQL ANSI. La diferencia más esencial se encuentra en la posición de los operadores, ya que en LinQ cambia el orden y sus consultas empiezan por la cláusula from en vez de empezar por la cláusula Select como en SQL. Esto trajo bastante controversia en los inicios de LinQ, pero fue necesario hacer este cambio, para que las herramientas de desarrollo pudieran tener toda la información y poder hacer uso del intellisense.

Pues hasta aquí la introducción, a partir de aquí ya entraremos en materia de forma más seria en el siguiente post.