Compartir a través de


Características de Visual Basic que admiten 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 consultar 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 la comprobación en tiempo de compilación de errores de sintaxis y seguridad de tipos. Esta integración también garantiza que ya sabe la mayoría de lo que tiene que saber para escribir consultas enriquecidas y variadas en Visual Basic.

En las secciones siguientes se describen las construcciones de lenguaje que admiten LINQ con suficiente detalle para permitirle empezar a leer la documentación introductoria, los ejemplos de código y las aplicaciones de ejemplo. También puede hacer clic en los vínculos para encontrar explicaciones más detalladas sobre cómo se unen las características del lenguaje para habilitar la consulta integrada por el lenguaje. 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 qué operadores de consulta estándar están en el alcance especificando el espacio de nombres adecuado con una instrucción de Imports. La sintaxis de una expresión de consulta de Visual Basic tiene este aspecto:

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

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

Variables con tipo implícito

En lugar de especificar explícitamente un tipo al declarar e inicializar una variable, puede habilitar el compilador para deducir y asignar el tipo. Esto se conoce como inferencia de tipos locales.

Las variables cuyos tipos se deducen están fuertemente tipadas, al igual que las variables cuyo tipo se especifica explícitamente. La inferencia de tipos locales solo funciona cuando se define una variable local dentro de un cuerpo del método. Para obtener más información, vea Option Infer Statement y Local Type Inference.

En el ejemplo siguiente se muestra la inferencia de tipos locales. Para usar este ejemplo, debe establecer Option Infer a 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 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, se produce la inferencia de tipos si Option Infer es On o Off. Se produce un error en tiempo de compilación si Option Infer es Off y Option Strict es 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. Mediante el uso de 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 públicas Name y Phone, 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 obtener más información, vea Inicializadores de objetos: 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 de 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 y 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, consulte Tipos anónimos (Guía de programación de C#).

Métodos de extensión.

Los métodos de extensión permiten agregar métodos a un tipo de datos o interfaz desde fuera de la definición. Esta característica le permite, en efecto, agregar nuevos métodos a un tipo existente sin modificar realmente el tipo. Los operadores de consulta estándar son un conjunto de métodos de extensión que proporcionan funcionalidad de consulta LINQ para cualquier tipo que implemente IEnumerable<T>. Otras extensiones para IEnumerable<T> incluir Count, Uniony Intersect.

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

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

El método se llama como 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 un nombre que calcula y devuelve un valor único. A diferencia de las funciones con nombre, se puede definir y ejecutar una expresión lambda 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 expresión lambda a un nombre de variable y, a continuación, 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 Whiley otros.

Por ejemplo, el código siguiente define una consulta que devuelve todos los alumnos mayores 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 código similar al ejemplo siguiente, 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 For Each bucle :

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

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

Consulte también