Características de Visual Basic compatibles con LINQ

El nombre Language-Integrated Query (LINQ) hace referencia a la tecnología de Visual Basic que admite la sintaxis de consulta y otras construcciones de lenguaje directamente en el lenguaje. Con LINQ, no es necesario aprender un nuevo lenguaje para realizar consultas en un origen de datos externo. Puede consultar datos en bases de datos relacionales, almacenes XML u objetos mediante Visual Basic. Esta integración de las funcionalidades de consulta en el lenguaje permite comprobar en tiempo de compilación los errores de sintaxis y la seguridad de los tipos. Esta integración también garantiza que ya sepa casi todo lo que debe saber para escribir consultas completas y variadas en Visual Basic.

En las secciones siguientes se describen en detalle las construcciones de lenguaje que admiten LINQ. Con esta información, podrá empezar a leer la documentación introductoria, los ejemplos de códigos y las aplicaciones de ejemplo. También puede hacer clic en los vínculos para encontrar explicaciones más detalladas de cómo se unen las características del lenguaje para habilitar Language Integrated Query. Un buen punto de partida es Tutorial: Escribir consultas en Visual Basic.

Expresiones de consulta

Las expresiones de consulta de Visual Basic se pueden expresar en una sintaxis declarativa similar a la de SQL o XQuery. En tiempo de compilación, la sintaxis de consulta se convierte en llamadas de método a la implementación de los métodos de extensión de operador de consulta estándar por parte de un proveedor de LINQ. Las aplicaciones controlan cuáles son los operadores de consulta estándar que están en el ámbito. Esto se hace al especificar el espacio de nombres adecuado con una instrucción Imports. La sintaxis de una expresión de consulta de Visual Basic es así:

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
                  Order By cust.Name Ascending
                  Select cust.Name, cust.Phone

Para más información, vea Introducción a LINQ en Visual Basic.

Variables con asignación implícita de tipos

En lugar de especificar explícitamente un tipo al declarar e inicializar una variable, se puede habilitar el compilador para que infiera y asigne el tipo. Esto se conoce como inferencia de tipo de variable local.

Las variables cuyos tipos se infieren están fuertemente tipadas, al igual que las variables cuyo tipo se especifica explícitamente. La inferencia de tipos de variables locales solo funciona cuando se define una variable local dentro del cuerpo de un método. Para más información, consulte Instrucción de la inferencia de opciones e Inferencia de tipo de variable local.

En el ejemplo siguiente se muestra la inferencia de tipo de variable local. Para usar este ejemplo, tendrá que establecer Option Infer en On.

' The variable aNumber will be typed as an integer.
Dim aNumber = 5

' The variable aName will be typed as a String.
Dim aName = "Virginia"

La inferencia de tipos de variables locales también permite crear tipos anónimos, que se describen más adelante en esta sección y son necesarios para las consultas LINQ.

En el siguiente ejemplo de LINQ, la inferencia de tipos se produce si Option Infer es On o Off. Se produce un error en tiempo de compilación si Option Infer está en Off y si Option Strict está en On.

' Query example.
' If numbers is a one-dimensional array of integers, num will be typed
' as an integer and numQuery will be typed as IEnumerable(Of Integer)--
' basically a collection of integers.

Dim numQuery = From num In numbers
               Where num Mod 2 = 0
               Select num

Inicializadores de objeto

Los inicializadores de objeto se usan en expresiones de consulta cuando tiene que crear un tipo anónimo para contener los resultados de una consulta. También se pueden usar para inicializar objetos de tipos con nombre fuera de las consultas. Si usa un inicializador de objeto, puede inicializar un objeto en una sola línea sin llamar explícitamente a un constructor. Suponiendo que tiene una clase denominada Customer que tiene propiedades Name y Phone públicas, junto con otras propiedades, se puede usar un inicializador de objeto de esta manera:

Dim aCust = New Customer With {.Name = "Mike",
                               .Phone = "555-0212"}

Para más información, consulte Inicializadores de objeto: Tipos con nombre y anónimos.

Tipos anónimos

Los tipos anónimos proporcionan una manera cómoda de agrupar temporalmente un conjunto de propiedades en un elemento que desea incluir en un resultado de consulta. Esto le permite elegir cualquier combinación entre los campos disponibles en la consulta, en cualquier orden, sin definir un tipo de datos con nombre para el elemento.

El compilador construye dinámicamente un tipo anónimo. El compilador asigna el nombre del tipo, que puede cambiar con cada nueva compilación. Por lo tanto, el nombre no se puede usar directamente. Los tipos anónimos se inicializan de la siguiente manera:

' Outside a query.
Dim product = New With {.Name = "paperclips", .Price = 1.29}

' Inside a query.
' You can use the existing member names of the selected fields, as was
' shown previously in the Query Expressions section of this topic.
Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Select cust.Name, cust.Phone

' Or you can specify new names for the selected fields.
Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Select CustomerName = cust.Name,
                   CustomerPhone = cust.Phone

Para obtener más información, vea Tipos anónimos.

Métodos de extensión.

Los métodos de extensión permiten agregar métodos a un tipo de datos o a una interfaz desde fuera de la definición. Esta característica permite, en efecto, agregar nuevos métodos a un tipo existente sin llegar a modificarlo. Los operadores de consulta estándar son un conjunto de métodos de extensión que proporcionan funciones de consultas LINQ para cualquier tipo que implemente IEnumerable<T>. Otras extensiones para IEnumerable<T> incluyen Count, Union y Intersect.

El siguiente método de extensión agrega un método de impresión a la clase String.

' Import System.Runtime.CompilerServices to use the Extension attribute.
<Extension()>
Public Sub Print(ByVal str As String)
    Console.WriteLine(str)
End Sub

La llamada al método es como la que se realiza a un método de instancia normal de String:

Dim greeting As String = "Hello"
greeting.Print()

Para obtener más información, vea Métodos de extensión.

Expresiones lambda

Una expresión lambda es una función sin nombre que calcula y devuelve un valor único. A diferencia de las funciones con nombre, una expresión lambda se puede definir y ejecutar al mismo tiempo. En el ejemplo siguiente se muestran 4.

Console.WriteLine((Function(num As Integer) num + 1)(3))

Puede asignar la definición de la expresión lambda a un nombre de variable y después usar el nombre para llamar a la función. En el ejemplo siguiente también se muestran 4.

Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))

En LINQ, las expresiones lambda subyacen a muchos de los operadores de consulta estándar. El compilador crea expresiones lambda para capturar los cálculos definidos en métodos de consulta fundamentales, como Where, Select, Order By, Take While y otros.

Por ejemplo, el código siguiente define una consulta que devuelve todos los alumnos de último año de una lista de alumnos.

Dim seniorsQuery = From stdnt In students
                   Where stdnt.Year = "Senior"
                   Select stdnt

La definición de consulta se compila en un código similar al del siguiente ejemplo, que usa dos expresiones lambda para especificar los argumentos de Where y Select.

Dim seniorsQuery2 = students.
    Where(Function(st) st.Year = "Senior").
    Select(Function(s) s)

Cualquiera de las versiones se puede ejecutar mediante un bucle For Each:

For Each senior In seniorsQuery
    Console.WriteLine(senior.Last & ", " & senior.First)
Next

Para obtener más información, vea Expresiones lambda.

Consulte también