Operaciones básicas de consulta (Visual Basic)
Actualización: noviembre 2007
En este tema se proporciona una breve introducción a las expresiones Language-Integrated Query (LINQ) en Visual Basic y algunos de los tipos de operaciones que suelen realizarse en las consultas. Para obtener más información, vea los temas siguientes:
Introducción a LINQ en Visual Basic
Especificar el origen de datos (From)
En una consulta LINQ, el primer paso es especificar el origen de datos que se desea consultar. Por consiguiente, la cláusula From siempre ocupa el primer lugar en una consulta. Los operadores de consulta seleccionan y dan forma al resultado basándose en el 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, realmente 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 establecimiento inflexible de tipos, vea Relaciones entre tipos en operaciones de consulta (Visual Basic).
Para obtener más información sobre cómo utilizar la cláusula From en Visual Basic, vea From (Cláusula, Visual Basic).
Filtrar los datos (Where)
Probablemente la operación de consulta más común es aplicar un filtro en forma de expresión booleana. Así, la consulta devuelve sólo los elementos para los que la expresión es verdadera. La cláusula Where se utiliza para realizar el filtrado. El filtro especifica qué elementos del origen de datos se incluirán en la secuencia resultante. En el ejemplo siguiente, sólo se incluyen los clientes que tienen una dirección en Londres (London).
Dim londonCusts = From cust In customers _
Where cust.City = "London" _
' ...
Puede utilizar operadores lógicos como And y Or para combinar expresiones de filtro en una cláusula Where. Por ejemplo, para devolver sólo los clientes de Londres que se llamen Devon, utilice el código siguiente:
Where cust.City = "London" And cust.Name = "Devon" _
Para devolver los clientes de Londres o París, utilice el código siguiente:
Where cust.City = "London" Or cust.City = "Paris" _
Para obtener más información sobre cómo utilizar la cláusula Where en Visual Basic, vea Where (Cláusula, Visual Basic).
Ordenar los datos (Order By)
A menudo es útil ordenar los datos devueltos según un criterio determinado. La cláusula Order By hará que se ordenen los elementos de la secuencia devuelta según uno o varios campos que se especifiquen. Por ejemplo, la consulta siguiente ordena los resultados según la propiedad Name. Dado que Name es una cadena, los datos devueltos se ordenarán alfabéticamente, de la A a la 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, utilice la cláusula Order By...Descending. Cuando no se especifica Ascending ni Descending, se usa Ascending de manera predeterminada.
Para obtener más información sobre cómo utilizar la cláusula Order By en Visual Basic, vea Order By (Cláusula, Visual Basic).
Seleccionar los datos (Select)
La cláusula Select especifica la forma y el contenido de los elementos devueltos. Por ejemplo, puede especificar si sus resultados estarán formados por objetos Customer completos, sólo una propiedad Customer, un subconjunto de propiedades, una combinación de propiedades de varios orígenes de datos o algún tipo de resultado nuevo 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 formada por objetos Customer completos, seleccione la variable de rango:
Dim londonCusts2 = From cust In customers _
Where cust.City = "London" _
Order By cust.Name Ascending _
Select cust
Si una instancia de Customer es un objeto grande con muchos campos y lo único que desea recuperar es el nombre, puede seleccionar cust.Name, como se muestra en el ejemplo siguiente. La inferencia de tipo de variable local reconoce que se 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 desea incluir en el resultado. El compilador definirá un tipo anónimo que tiene esos campos como propiedades. Para obtener más información, consulte Tipos anónimos.
Dado que los elementos devueltos en el ejemplo siguiente son instancias de un tipo anónimo, no puede hacer referencia al tipo por su nombre en ninguna otra parte del código. El nombre designado para el tipo por el compilador contiene caracteres que no son válidos en el código de Visual Basic normal. En el ejemplo siguiente, los elementos de la colección devuelta por la consulta en londonCusts4 son todos instancias de un tipo anónimo.
Dim 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 desea incluir en el resultado y cree e inicialice instancias del tipo en la cláusula Select. Utilice esta opción sólo si tiene que utilizar los resultados individuales fuera de la colección en la que se devuelven, o si tiene que pasarlos como parámetros en llamadas a método. El tipo de londonCusts5 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 utilizar la cláusula Select en Visual Basic, vea Select (Cláusula, Visual Basic).
Combinar los 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 utiliza dos orígenes de datos y combina implícitamente las propiedades de ambos en el resultado. La consulta selecciona los estudiantes cuyos apellidos empiezan por 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 estudiantes creada en Cómo: Crear una lista de elementos. |
La palabra clave Join es equivalente a INNER JOIN en SQL. Combina dos colecciones según los valores de clave coincidentes entre los elementos de las dos colecciones. La consulta devuelve la totalidad o una 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 las colecciones en una sola colección jerárquica, igual que LEFT JOIN en SQL. Para obtener más información, consulte Join (Cláusula, Visual Basic) y Group Join (Cláusula, Visual Basic).
Agrupar los datos (Group By)
Puede agregar una cláusula Group By para agrupar los elementos de un resultado de consulta según uno o más campos de los elementos. Por ejemplo, el código siguiente agrupa los estudiantes por año de clase.
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 utilizando la lista de estudiantes creada en Cómo: Crear una lista de elementos, el resultado de la instrucción For Each es:
Year: Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
Year: Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
Year: Freshman
Mortensen, Sven
Garcia, Cesar
La variación mostrada en el código siguiente ordena los años de clase y, a continuación, ordena los estudiantes 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 acerca de Group By, vea Group By (Cláusula, Visual Basic).
Vea también
Tareas
Ejemplos de consultas (Visual Basic)
Conceptos
Información general sobre operadores de consulta estándar