La pregunta del millón ¿Qué es LINQ?
LINQ (Language Integrated Query o Lenguaje Integrado de Consultas - LINC :p) es algo más que una innovación a Visual Studio y el .NET Framework, ya que su función es la de eliminar la distancia que separa el mundo de los objetos y el mundo de los datos.
Por lo general, cuando queremos realizar consultas a una base de datos, lo hacemos, ya sea, con una cadena de consulta textual o bien con un procedimiento almacenado dentro de la base de datos accediéndola mediante métodos y propiedades, esto no nos permite comprobar los tipos en tiempo de compilación ni tampoco nos permite utilizar el querido IntelliSense de Visual Studio (comunmente llamado el "salvador" en algunos casos, y en otros "reverendo h...........", disculpen el lenguaje pero hay veces en las que realmente uno lo odia en Visual Studio 2005, más adelante les cuento porqué). Otra de las ventajas que tiene LINQ es que de acuerdo al motor de bases de datos que estemos utilizando, será necesario aprender el lenguaje de consultas específico (SQL, XML, Servicios Web, etc). Para ayudar en este sentido, LINQ convierte una consulta en una construcción del lenguaje de primera clase en Visual Basic (también en C#). Las consultas se escriben para colecciones de objetos con establecimiento inflexible de tipos, utilizando palabras clave del lenguaje y operadores con los que ya estamos familiarizados (algunos un poco más que otros). La imagen que se encuentra abajo muestra una consulta LINQ parcialmente completada en una base de datos de SQL Server en C# (esto es así porque la imagen viene de la documentación de Visual Studio, y a los muchachos de Microsoft les gusta más C#, a mi personalmente me gusta solo cuando lo necesito), con comprobanción de tipos completa y compatibilidad con IntelliSense.

Con Visual Studio podemos escribir consultas LINQ en Visual Basic con bases de Datos SQL Server, XML, conjuntos de datos ADO.NET, y cualquier colección de objetos que admita IEnumerable o la interfaz genérica IEnumerable<(Of<(T>)>). No es momento para que cunda el pánico, todo está muy bien explicado en la documentación de Visual Studio, aunque de todos modos en futuros posts intentaré profundizar en estos temas tan (des)agradables. Una de las cosas más importantes de LINQ es que podemos extender sus capacidades y encontrarnos con una gran cantidad de proveedores que ya lo hacen para distintas implementaciones de bases de datos y servicios web.
Nuestra Primera Consulta con LINQ
Como ya todos sabemos (porque fuimos a Hardvard, sobre todo los que recién comienzan con el mundo de la programación), una consulta es una expresión que recupera datos a partir de un origen de datos. Las consultas se expresan en un lenguaje de consultas dedicado (esto quiere decir, que se expresan en un patrón general, ya sea SQL, XML, etc.). Esto quiere decir, que nosotros, como desarrolladores, tenemos que aprender cada nuevo lenguaje de consultas que aparece en el mercado, y aunque no todos los días aparece uno nuevo, puedo asegurarles que hay de todos los sabores y colores, es por esto que LINQ viene al rescate como un caballero de la mesa redonda (muy cursi!!!). En LINQ "SIEMPRE" trabajamos con objetos, por lo tanto siempre utilizamos los mismos modelos de codificación básicos para consultar y transformar los datos en diferentes formatos, ya sea XML, SQL, conjuntos de datos y entidades de ADO.NET, colecciones de .NET Framework y cualquier otro formato de u origen de datos para el que tengamos disponible un proveedor LINQ.
' 1. Origen de datos.
Dim numeros() As Integer = {0, 1, 2, 3, 4, 5, 6}
' 2. Creación de la consulta.
Dim evensQuery = From num In numeros _
Where num Mod 2 = 0 _
Select num
' 3. Ejecución de la consulta.
For Each numero In evensQuery
Console.Write(number & " ")
Next
En el ejemplo, el resultado nos dará algo como esto:
0, 2, 4, 6
Inferencia de Tipos
Como podemos observar, LINQ no es complicado para nada y una de las grandes ventajas que presenta es la de "Inferencia de Tipos". Esta inferencia de tipos es la que nos permite crear una consulta del tipo que vemos en el punto 2 del código fuente, permitiéndonos declarar una variable sin definir su tipo. La definición del tipo es asignada automáticamente por el compilador de Visual Basic. Esta deducción que realiza el compilador la logra de acuerdo al contenido de la variable (aunque a veces no es bueno, Visual Basic es lo suficientemente inteligente como para hacer la deducción correcta).
Public Sub inferenceExample()
' Declaración Explícita.
Dim num1 As Integer = 3
' Inferencia local de tipos.
Dim num2 = 3
End Sub
La inferencia de tipos permite establecer el tipo de una variable de manera inflexible (lo que quiere decir que éste será el último tipo que se utilizará, en el caso del ejemplo será de tipo Integer), en lugar de dejarla como tipo Object. El compilador utiliza el inicializador de una variable para determinar su tipo con el fin de generar código de enlace en tiempo de compilación.
La inferencia de tipo se produce cuando una variable local se declara sin ninguna cláusula As y se le asigna un valor. El compilador utiliza el tipo del valor como el tipo de la variable.
La inferencia de tipo sólo se puede utilizar para las variables locales no estáticas; no se puede usar para determinar el tipo de los campos de clase, las propiedades o las funciones.
Creo que con esto podemos tener una vaga idea de lo que es LINQ. Les recomiendo que lo utilicen cuando lo crean necesario, ya que a pesar de todas las ventajas que presenta, también tiene sus contras, uno de ellos es el que al crear demasiadas consultas LINQ podemos hacer que nuestro programa consuma más memoria de la necesaria, y otro contra que tiene es que como el caso de un programa que estuve analizando hace poco, podemos encontrarnos con una chanchada de código que ni siquiera el programador entendía, pero bueno, son cosas que pasan cuando no utilizamos "COMENTARIOS". Me imagino que todos comentan los programas ¿o no?.
Saludos y nos encontramos en el próximo post en el que hablaremos de LINQ to SQL, uno de los temas más importantes si queremos llegar al final de nuestro programa de facturación (algún día dejaremos las promesas y llegaremos al final).