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 sintaxis de consulta y otras construcciones de lenguaje directamente en el lenguaje. Con LINQ, no tiene que aprender un nuevo lenguaje para realizar consultas contra un origen de datos externo. Puede realizar consultas contra datos de bases de datos relacionales, almacenes XML u objetos utilizando Visual Basic. Esta integración de capacidades de consulta en el lenguaje permite comprobar, en tiempo de compilación, errores de sintaxis y seguridad de tipos. Esta integración también le garantiza el conocimiento de los elementos esenciales para escribir consultas complejas y variadas en Visual Basic.
En las próximas secciones se describen las construcciones de lenguaje que admiten LINQ con suficiente detalle como para permitirle empezar a leer la documentación introductoria, ejemplos de código y aplicaciones de ejemplo. También puede hacer clic en los vínculos para encontrar explicaciones más detalladas de cómo las características del lenguaje contribuyen a permitir las consultas integradas en el lenguaje. Un buen lugar para empezar 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 a métodos en una implementación del proveedor LINQ de los métodos de extensión de operadores de consulta estándar. Las aplicaciones controlan qué operadores de consulta estándar están dentro del ámbito especificando el espacio de nombres adecuado con una instrucción Imports. La sintaxis para una expresión de consulta en Visual Basic es similar a ésta:
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 permitir al compilador deducir y asignar el tipo. Esto se conoce como inferencia de tipo de variable local.
Las variables cuyos tipos se deducen son fuertemente tipadas, como las variables cuyo tipo se especifica explícitamente. La inferencia de tipos de variable local solamente funciona cuando se define una variable local en el cuerpo de un método. Para obtener más información, vea Option Infer (instrucción) y Inferencia de tipo de variable local (Visual Basic).
En el ejemplo siguiente se muestra la inferencia de tipos de variable local. Para usar este ejemplo, debe 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 tipo de variable local 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 ejemplo siguiente de LINQ, la inferencia de tipos se produce si Option Infer es On u Off. Se producirá 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 utilizan en expresiones de consulta cuando se debe crear un tipo anónimo para albergar los resultados de una consulta. También se pueden utilizar para inicializar objetos de tipos con nombre fuera de las consultas. Utilizando 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 con propiedades públicas Name y Phone, además de otras propiedades, un inicializador de objeto se puede utilizar de esta manera:
Dim aCust = New Customer With {.Name = "Mike",
.Phone = "555-0212"}
Para obtener más información, vea Inicializadores de objeto: Tipos con nombre y anónimos (Visual Basic).
Tipos anónimos
Los tipos anónimos proporcionan una manera práctica de agrupar temporalmente un conjunto de propiedades en un elemento que se desea incluir en un resultado de la consulta. Esto 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 tipo anónimo lo construye dinámicamente el compilador. El nombre del tipo es asignado por el compilador, y podría cambiar con cada nueva compilación. Por tanto, el nombre no se puede utilizar directamente. Los tipos anónimos se inicializan de la manera siguiente:
' 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 (Visual Basic).
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 agregar nuevos métodos a un tipo existente sin tener que modificar 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 implementa IEnumerable. Otras extensiones a IEnumerable 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
Al método se le llama como a un método de instancia ordinario de String:
Dim greeting As String = "Hello"
greeting.Print()
Para obtener más información, vea Métodos de extensión (Visual Basic).
Expresiones lambda
Una expresión lambda es una función sin nombre que calcula y devuelve un solo valor. A diferencia de las funciones con nombre, una expresión lambda se puede definir y ejecutar al mismo tiempo. El ejemplo siguiente muestra 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, a continuación, utilizar el nombre para llamar a la función. El ejemplo siguiente también muestra 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 los métodos de consulta básicos como Where, Select, Order By, Take While, etc.
Por ejemplo, el código siguiente define una consulta que devuelve todos los alumnos de último curso de una lista de alumnos.
Dim seniorsQuery = From stdnt In students
Where stdnt.Year = "Senior"
Select stdnt
La definición de la consulta se compila en código similar al del ejemplo siguiente, el cual utiliza 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 Lambda (expresiones) (Visual Basic).
Vea también
Referencia
Conceptos
Características de C# compatibles con LINQ