Bueno, esto de LINQ tiene tema para escribir un libro (o dos).
Resumiendo mucho, LINQ lo que nos permite es crear expresiones de
"consultas", es decir, se usan las instrucciones "típicas" de las consultas
de SQL: SELECT, FROM, JOIN, WHERE, ORDER BY, etc.
Lo bueno, es que esas instrucciones de consultas están incluidas en el
propio lenguaje, y lo mejor es que... ¡no solo sirven para trabajar con
acceso a datos!
Por ejemplo, podemos hacer algo así:
Dim res = From n In New Integer() {1, 2, 5, 3, 6, 7, 4} _
Where n > 3 _
Select n
For Each i In res
Console.WriteLine(i)
Next
Listado 1. Ejemplo de LINQ
Y el bucle final mostrará los valores 5, 6, 7 y 4, que son los que
cumplen la condición.
Para que el uso de LINQ sea posible, se han tenido que agregar a Visual
Basic (y a C#) nuevas características, entre ellas:
En inglés: Local variable type inferencing. Esto significa que el compilador es
capaz de "adivinar" el tipo de datos
que se le asigna a una variable.
En el ejemplo anterior, (Listado 1), la variable res es del tipo
IEnumerable(Of Integer), que es el tipo que devuelve la "expresión
LINQ".
La variable n después de From es de tipo
Integer y la variable i del bucle también
es de tipo Integer, ya que ese es el tipo de datos que
devuelve la "colección" res.
De forma más simple, puedes verlo así:
Dim num1 = 10
Dim num2 = 10.5
Dim s = "Hola"
En este caso, la variable num1 es de tipo
Integer, num2 es de tipo Double y
s es de tipo String.
Si tienes el Visual Basic (cualquier versión) puedes escribir ese mismo
código, pero para ello tendrá que tener Option Strict
desconectado y las tres variables serán de tipo Object.
Para que esta característica esté disponible en Visual Basic 2008, debe
estar conectada la opción Option Infer, que por defecto
está en "ON".
En inglés: Anonymous types. Pero... si en vez de devolver un "simple" valor entero,
(tal como se hace
en el código del listado 1), quieres devolver algo más "sofisticado",
podrías escribir esto otro:
Dim res2 = From n In New Integer() {1, 2, 5, 3, 6, 7, 4} _
Where n > 3 _
Select New With {.Valor = n, _
.Descripcion = "El valor del número " & n}
For Each i In res2
Console.WriteLine("{0} = {1}", _
i.Descripcion, i.Valor)
Next
Listado 2. Ejemplo de LINQ y tipos anónimos
Es decir, "la consulta", en lugar de devolver un valor "simple", estás
devolviendo valores "complicados".
En serio, en realidad, la variable res2, es del tipo IEnumerable(Of
???) es
decir de un tipo anónimo que tiene dos propiedades, una de tipo numérico (Integer)
llamada Valor y otra de tipo String llamada
Descripcion.
De hecho, en el bucle la variable "i" ahora es de ese tipo "anónimo" y el
compilador lo sabe, hasta el IDE de Visual Studio lo sabe y por eso el Intellisense muestra las
propiedades a las que podemos acceder, tal como
puedes ver en la figura 1.
Figura 1. Intellisense conoce a los tipos anónimos
Como el tipo "creado" es anónimo, no podemos definir variables de ese
tipo, pero si podemos crear nuevos objetos de ese mismo tipo anónimo.
Ya que el compilador de Visual Basic sabrá que queremos usar el mismo
"tipo", al menos si usamos las mismas propiedades, (tanto en nombre como en
tipos).
Por ejemplo, si quieres crear un objeto de ese mismo tipo anónimo, puedes
hacer algo así:
Dim quien = New With {.Valor = 10, .Descripcion = "Un tipo anónimo"}
Aunque no sepamos de que tipo es, el compilador si que lo sabe, y usa el
mismo que antes, en este caso, ese tipo se llama: VB$AnonymousType_0`2,
pero a pesar de que "pudieras" saber cómo se llama, no podrías declarar una
variable de ese tipo. Sino... ¡dejaría de ser anónimo!
¿Te imaginas las posibilidades que tienes esto?
Pues... te quedas corto... ¡tiene muchas más!
Ir al índice de las
novedades de Visual Basic 2008 (VB 9.0)