Con el desarrollo del proyecto de la Imagine Cup 08 de Microsoft, tuve que aprender a usar esta nueva tecnolog铆a de Microsoft, llamada LINQ, de la cual voy a (intentar) explicar acerca de ella.
Segun Wikipedia, Language Integrated Query (LINQ) es un proyecto de Microsoft que agrega consultas nativas semejantes a las de SQL a los lenguajes del .NET Framework, inicialmente a los lenguajes Visual Basic .NET y C#.
LINQ define operadores de consulta est谩ndar que permiten a lenguajes habilitados con LINQ filtrar, enumerar y crear proyecciones de varios tipos de colecciones usando la misma sintaxis. Tales colecciones pueden incluir arreglos, clases enumerables, XML, conjuntos de datos desde bases de datos relacionales y or铆genes de datos de terceros. El proyecto LINQ usa caracter铆sticas de la versi贸n 2.0 del .NET Framework, nuevos ensamblados relacionados con LINQ y extensiones para los lenguajes C# y Visual Basic .NET. Microsoft ha distribuido una versi贸n previa del LINQ, consistente de estas bibliotecas y compiladores para C# 3.0 y Visual Basic 9. Otros lenguajes, como F# y Nemerle, han anunciado brindar soporte preliminar.
LINQ to SQL es una implementaci贸n de O/RM(object relational mapping, mapeador de objetos relacionales) que viene con la versi贸n 鈥淥rcas鈥 del .NET Framework (o sea, la 3.5) y nos permite modelar bases de datos relacionales con clases de .NET. Podemos consultar bases de datos con LINQ, as铆 como actualizar/a帽adir/borrar datos de ellas. Podemos manipular los datos de tablas como si fuesen objetos (clases).
Los desarrolladores podemos usar LINQ con cualquier fuente de datos. Es posible ejecutar consultas eficientemente en los lenguajes de programaci贸n que eligamos (especialmente C#
), opcionalmente transformar/incrustar los resultados de las consultas en el formato que quieran, y entonces manipular f谩cilmente los resultados. Los lenguajes habilitados para LINQ pueden aportar seguridad de tipos y chequeo en tiempo de compilaci贸n el las expresiones de consulta, y desarrollar herramientas que aporten intelisense, debugging, y un gran soporte para refactoring cuando escriban c贸digo de LINQ.
Visual Studio 2008 viene con un dise帽ador de LINQ to SQL que nos aporta una forma f谩cil de modelar y visualizar una base de datos como un modelo de objeto de LINQ to SQL (me recuerda mucho al SQL Server Express Management Studio cuando haces diagramas a las BD).
Usando este dise帽ador LINQ to SQL, se puede crear f谩cilmente una representaci贸n de la base de datos 鈥淣orthwind鈥, con solo arrastrar las tablas, procedimientos almacenados y vistas desde el Explorador de servidores, tal y como lo vemos ac谩:

El dise帽o de arriba define cuatro clases: Product, Category, Order y OrderDetail. Las propiedades de cada clase mapean las columnas de cada tabla en la base de datos. Cada instancia de esa clase representa una fila en las tablas, en otras palabras, las tablas sse convierten en “clases” que podemos instanciar despu茅s, ya sea para consultar, modificar, insertar y/o eliminar.
Las flechas entre las cuatro clases de arriba representan las asociaciones/relaciones entre las diferentes entidades. Son t铆picamente modeladas como relaciones primary-key/foreign-key en la base de datos. La direcci贸n de las flechas en el dise帽ador indican la cardinalidad (uno a uno o uno a muchos). Autom谩ticamente se a帽aden propiedades fuertemente tipadas a las entidades bas谩ndose en esto. Por ejemplo, la clase Category de arriba tiene una relaci贸n de uno-a-muchos con la clase Product. Esto implica que tendr谩 una propiedad 鈥淐ategories鈥 que es una colecci贸n de objetos Product con esa categor铆a. La clase Product entonces tiene una propiedad 鈥淐ategory鈥 que apunta a una instancia de la clase Category representando la categor铆a a la que pertenece el producto.
El panel de la derecha del dise帽ador LINQ to SQL contiene una lista de procedimientos almacenados que interact煤an con el modelo de base de datos. En el ejemplo de arriba se ve un Procedimiento almacenado llamado 鈥淕etProductsByCategory鈥. Como entrada recibe un categoryID, y devuelve una secuencia de Product como resultado. Esto lo voy a tomar para un futuro post, por el momento voy a mostrar una consulta simple, como el cl谩sico “hola mundo” en LINQ.
A este modelo llamaremos DataContext. Una vez que tenemos el modelo (archivo .dbml) ya podemos instanciar tablas como si fueran clases, o incluso el mismo DataContext.
Por ejemplo, si queremos hacer un query que nos devuelva el registros de la tabla Category (por cuestiones de facilidad, ya que posee pocos campos o columnas) donde el campo CategoryName sea igual a ‘ejemplo’, estaremos pensando en el cl谩sico:
SELECT CategoryID, CategoryName, Description, Picture FROM Category where CategoryName = 'ejemplo'
lo cual hay muchos m茅todos para mostrarlos, por ejemplo con el m茅todo conectado, tendr铆amos que crear una conexi贸n, definir un Command, definir un DataReader, abrir la conexi贸n, ejecutar el DataReader, imprimir los datos y cerrar la conexi贸n.
La ventaja con LINQ, es que no tenemos que especificar nada de esto, 煤nicamente con un query (que por cierto su sintaxis es totalmente “al rev茅s” y por lo general se utiliza un nuevo tipo de dato llamado ‘var’) y se ejecuta hasta que se usa, lo cual mejora grandemente el rendimiento de la aplicaci贸n y reduce el tiempo de conexi贸n al servidor.
Por ejemplo, para el mismo query de arriba (obvio, en C#):
NorthwindDataContext dc = new NorthwindDataContext();
//creamos un DataContext llamado dc.
var query = from c in dc.Category
where c.CategoryName == 'ejemplo'
select c;
//este es el query, se ejecutar谩 hasta que lo ocupemos en alg煤n lugar del c贸digo.
foreach(string algo in query)
{
Response.Write(algo);
}
//en el ciclo foreach se ejecuta la consulta, se devuelven los datos y se imprimen.
y eso es todo, despu茅s voy a poner otras formas de usar esta tecnolog铆a nueva, siempre con bases de datos.
lo cual devuelve un IEnumerable del tipo de objetos Category