Operaciones básicas de consulta (Visual Basic)
En este tema se proporciona una breve introducción a las expresiones de Language Integrated Query (LINQ) en Visual Basic y a algunas de las clases de operaciones típicas que se realizan en una consulta. Para obtener más información, vea los temas siguientes:
Introducción a LINQ en Visual Basic
Tutorial: Escribir consultas en Visual Basic
Especificación del origen de datos (From)
En una consulta LINQ, el primer paso es especificar el origen de datos que se quiere consultar. Por lo tanto, la cláusula From
de una consulta siempre va primero. Los operadores de consulta seleccionan y dan forma al resultado en función del tipo del origen.
Dim query = From cust In customers
' ...
La cláusula From
especifica el origen de datos, customers
y una variable de rango, cust
. La variable de rango es como una variable de iteración de bucle, con la diferencia de que en una expresión de consulta no se produce ninguna iteración. Cuando se ejecuta la consulta, a menudo mediante un bucle For Each
, la variable de rango actúa como referencia para cada elemento sucesivo de customers
. Dado que el compilador puede deducir el tipo de cust
, no tiene que especificarlo explícitamente. Para obtener ejemplos de consultas escritas con y sin tipos explícitos, vea Relaciones entre tipos en operaciones de consulta (Visual Basic).
Para obtener más información sobre cómo usar la cláusula From
en Visual Basic, vea From (Cláusula).
Filtrado de datos (Where)
Probablemente la operación de consulta más común es aplicar un filtro en forma de expresión booleana. Entonces la consulta devuelve solo los elementos en los que la expresión es verdadera. Se usa una cláusula Where
para realizar el filtrado. El filtro especifica qué elementos del origen de datos se van a incluir en la secuencia resultante. En el ejemplo siguiente solo se incluyen los clientes cuya dirección se encuentra en Londres.
Dim londonCusts = From cust In customers
Where cust.City = "London"
' ...
También puede usar operadores lógicos como And
y Or
para combinar expresiones de filtro en una cláusula Where
. Por ejemplo, para devolver solo aquellos clientes que son de Londres y cuyo nombre es Devon, use el código siguiente:
Where cust.City = "London" And cust.Name = "Devon"
Para devolver los clientes de Londres o París, use el código siguiente:
Where cust.City = "London" Or cust.City = "Paris"
Para obtener más información sobre cómo usar la cláusula Where
en Visual Basic, vea Where (Cláusula).
Ordenación de datos (Order By)
A veces resulta conveniente ordenar los datos devueltos en un orden determinado. La cláusula Order By
hace que los elementos de la secuencia devuelta se ordenen por un campo o campos especificados. Por ejemplo, la consulta siguiente ordena los resultados según la propiedad Name
. Dado que Name
es una cadena, los datos devueltos se ordenan alfabéticamente, de A a Z.
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
' ...
Para ordenar los resultados en orden inverso, de la Z a la A, use la cláusula Order By...Descending
. Si no se especifica Ascending
ni Descending
, el valor predeterminado es Ascending
.
Para obtener más información sobre cómo usar la cláusula Order By
en Visual Basic, vea Order By (Cláusula).
Selección de datos (Select)
La cláusula Select
especifica el formato y el contenido de los elementos devueltos. Por ejemplo, puede especificar si los resultados constan de objetos completos Customer
, solo una propiedad Customer
, un subconjunto de propiedades, una combinación de propiedades de varios orígenes de datos o algún nuevo tipo de resultado basado en un cálculo. Cuando la cláusula Select
genera algo distinto de una copia del elemento de origen, la operación se denomina proyección.
Para recuperar una colección que conste de objetos completos Customer
, seleccione la propia variable de rango:
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust
Si una instancia Customer
es un objeto grande que tiene muchos campos y lo único que quiere recuperar es el nombre, puede seleccionar cust.Name
, como se muestra en el ejemplo siguiente. La inferencia de tipo de variable local reconoce que esto cambia el tipo de resultado de una colección de objetos Customer
a una colección de cadenas.
Dim londonCusts3 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name
Para seleccionar varios campos del origen de datos, tiene dos opciones:
En la cláusula
Select
, especifique los campos que quiere incluir en el resultado. El compilador define un tipo anónimo que tiene esos campos como sus propiedades. Para obtener más información, consulte Tipos anónimos (Guía de programación de C#).Dado que los elementos devueltos en el ejemplo siguiente son instancias de un tipo anónimo, no puede hacer referencia al tipo por nombre en otra parte del código. El nombre designado por el compilador para el tipo contiene caracteres que no son válidos en el código normal de Visual Basic. En el ejemplo siguiente, los elementos de la colección devuelta por la consulta de
londonCusts4
son instancias de un tipo anónimoDim londonCusts4 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select Name = cust.Name, Phone = cust.Phone For Each londonCust In londonCusts4 Console.WriteLine(londonCust.Name & " " & londonCust.Phone) Next
O bien
Defina un tipo con nombre que contenga los campos concretos que quiere incluir en el resultado y cree e inicialice instancias del tipo en la cláusula
Select
. Use esta opción solo si tiene que usar resultados individuales fuera de la colección en la que se devuelven, o si tiene que pasarlos como parámetros en llamadas de método. El tipo delondonCusts5
en el ejemplo siguiente es IEnumerable(Of NamePhone).Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End Class
Dim londonCusts5 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select New NamePhone With {.Name = cust.Name, .Phone = cust.Phone}
Para obtener más información sobre cómo usar la cláusula Select
en Visual Basic, vea Select (Cláusula).
Combinación de datos (Join y Group Join)
Puede combinar más de un origen de datos en la cláusula From
de varias maneras. Por ejemplo, el código siguiente usa dos orígenes de datos y combina implícitamente propiedades de ambos en el resultado. La consulta selecciona a los alumnos cuyos apellidos comienzan por un vocal.
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
Where student.Last.IndexOf(vowel) = 0
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
For Each vName In vowelNames
Console.WriteLine(vName.Initial & ": " & vName.Name)
Next
Nota
Puede ejecutar este código con la lista de alumnos creada en Procedimiento para crear una lista de elementos.
La palabra clave Join
es equivalente a INNER JOIN
en SQL. Combina dos colecciones en función de valores de clave coincidentes entre elementos de las dos colecciones. La consulta devuelve todos o parte de los elementos de la colección que tienen valores de clave coincidentes. Por ejemplo, el código siguiente duplica la acción de la combinación implícita anterior.
Dim vowelNames2 = From student In students
Join vowel In vowels
On student.Last(0) Equals vowel
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
Group Join
combina colecciones en una sola colección jerárquica, igual que LEFT JOIN
en SQL. Para obtener más información, vea Join (Cláusula) y Group Join (Cláusula).
Agrupación de datos (Group By)
Puede agregar una cláusula Group By
para agrupar los elementos de un resultado de consulta en función de uno o varios campos de los elementos. Por ejemplo, el código siguiente agrupa a los alumnos por año académico.
Dim studentsByYear = From student In students
Select student
Group By year = student.Year
Into Classes = Group
For Each yearGroup In studentsByYear
Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
For Each student In yearGroup.Classes
Console.WriteLine(" " & student.Last & ", " & student.First)
Next
Next
Si ejecuta este código con la lista de alumnos creada en Procedimiento para crear una lista de elementos, la salida de la instrucción For Each
es:
Año: Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
Año: Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
Año: Freshman
Mortensen, Sven
Garcia, Cesar
La variación que se muestra en el código siguiente ordena los años académicos y luego ordena a los alumnos dentro de cada año por apellido.
Dim studentsByYear2 = From student In students
Select student
Order By student.Year, student.Last
Group By year = student.Year
Into Classes = Group
Para obtener más información sobre Group By
, vea Group By (Cláusula).