Tutorial: Escribir consultas en Visual Basic
Este tutorial muestra cómo se pueden utilizar las características del lenguaje Visual Basic para escribir expresiones de consulta Language-Integrated Query (LINQ). El tutorial muestra cómo crear consultas en una lista de objetos Student, cómo ejecutar las consultas y cómo modificarlas. Las consultas incorporan varias características nuevas de Visual Basic 2008, incluidos los inicializadores de objeto, la inferencia de tipos de variable local y los tipos anónimos.
Después de completar este tutorial, estará preparado para ver los ejemplos y la documentación del proveedor LINQ específico que le interese. Entre los proveedores LINQ se incluyen LINQ to SQL, LINQ to DataSet y LINQ to XML.
Para obtener una versión en vídeo de este tema, vea Video How to: Writing Queries in Visual Basic.
Crear un proyecto
Para crear un proyecto de aplicación de consola
Inicie Visual Studio.
En el menú Archivo, elija Nuevo y haga clic en Proyecto.
En la lista Plantillas instaladas, haga clic en Visual Basic.
En la lista de tipos de proyecto, haga clic en Aplicación de consola. En el cuadro Nombre, escriba un nombre para el proyecto y, a continuación, haga clic en Aceptar.
Se crea un proyecto. De forma predeterminada, contiene una referencia a System.Core.dll. Asimismo, la lista Espacios de nombres importados de Página Referencias, Diseñador de proyectos (Visual Basic) incluye el espacio de nombres System.Linq.
Agregar un origen de datos en memoria
El origen de datos de las consultas de este tutorial es una lista de objetos Student. Cada objeto Student contiene un nombre, un apellido, un año de clase y un grado académico en el cuerpo del estudiante.
Para agregar el origen de datos
Defina una clase Student y cree una lista de instancias de la clase.
Importante El código necesario para definir la clase Student y crear la lista que se utiliza en los ejemplos del tutorial se proporciona en Cómo: Crear una lista de elementos. Puede copiarlo de allí y pegarlo en su proyecto. El nuevo código reemplaza el código que aparecía al crear el proyecto.
Para agregar un nuevo estudiante a la lista de estudiantes
- Siga el modelo del método getStudents para agregar otra instancia de la clase Student a la lista. Al agregar el estudiante, verá por primera vez los inicializadores de objeto. Para obtener más información, vea Inicializadores de objeto: Tipos con nombre y anónimos (Visual Basic).
Crear una consulta
Cuando se ejecute, la consulta agregada en esta sección generará una lista de los estudiantes cuyo grado académico los sitúa entre los diez mejores. Dado que la consulta selecciona cada vez el objeto Student completo, el tipo del resultado de la consulta es IEnumerable(Of Student). Sin embargo, el tipo de la consulta no suele especificarse en las definiciones de consulta. En su lugar, el compilador utiliza la inferencia de tipo de variable local para determinar el tipo. Para obtener más información, consulte Inferencia de tipo de variable local (Visual Basic). La variable de rango de la consulta, currentStudent, actúa como referencia para cada instancia de Student del origen, students, proporcionando acceso a las propiedades de cada objeto de students.
Para crear una consulta sencilla
Busque la parte del método Main del proyecto que está marcada de esta manera:
' ****Paste query and query execution code from the walkthrough, ' ****or any code of your own, here in Main.
Copie el código siguiente y péguelo en ella.
Dim studentQuery = From currentStudent In students Where currentStudent.Rank <= 10 Select currentStudent
Sitúe el puntero del mouse encima de studentQuery en el código para comprobar que el tipo asignado por el compilador es IEnumerable(Of Student).
Ejecutar la consulta
La variable studentQuery contiene la definición de la consulta, no los resultados de ejecutarla. Un mecanismo habitual para ejecutar una consulta es un bucle For Each. Se tiene acceso a cada elemento de la secuencia devuelta a través de la variable de iteración del bucle. Para obtener más información sobre la ejecución de consultas, vea Escribir la primera consulta con LINQ (Visual Basic).
Para ejecutar la consulta
Agregue el bucle For Each siguiente debajo de la consulta en su proyecto.
For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) Next
Sitúe el puntero del mouse encima de la variable de control de bucle studentRecord para ver su tipo de datos. Se infiere que el tipo de studentRecord es Student, porque studentQuery devuelve una colección de instancias de Student.
Genere y ejecute la aplicación; para ello, presione CTRL+F5. Observe los resultados en la ventana de la consola.
Modificar la consulta
Es más fácil examinar los resultados de la consulta si están en un orden concreto. Puede ordenar la secuencia devuelta según cualquier campo que esté disponible.
Para ordenar los resultados
Agregue la cláusula Order By siguiente entre la instrucción Where y la instrucción Select de la consulta. La cláusula Order By ordenará los resultados alfabéticamente de la A a la Z, por apellido de estudiante.
Order By currentStudent.Last Ascending
Para ordenar los resultados primero por apellido y después por nombre, agregue ambos campos a la consulta:
Order By currentStudent.Last Ascending, currentStudent.First Ascending
También puede especificar Descending para ordenar los resultados de la Z a la A.
Genere y ejecute la aplicación; para ello, presione CTRL+F5. Observe los resultados en la ventana de la consola.
Para incluir un identificador local
Agregue el código de esta sección para incluir un identificador local en la expresión de consulta. El identificador local contendrá un resultado intermedio. En el ejemplo siguiente, name es un identificador que contiene una concatenación del nombre y el apellido del estudiante. Se puede usar un identificador local por comodidad o para mejorar el rendimiento, ya que almacena los resultados de una expresión que, de otro modo, se calcularía varias veces.
Dim studentQuery2 = From currentStudent In students Let name = currentStudent.Last & ", " & currentStudent.First Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10 Order By name Ascending Select currentStudent ' If you see too many results, comment out the previous ' For Each loop. For Each studentRecord In studentQuery2 Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) Next
Genere y ejecute la aplicación; para ello, presione CTRL+F5. Observe los resultados en la ventana de la consola.
Para proyectar un campo en la cláusula Select
Agregue la consulta y el bucle For Each de esta sección para crear una consulta que genere una secuencia cuyos elementos difieran de los elementos del origen. En el ejemplo siguiente, el origen es una colección de objetos Student, pero sólo se devuelve un único miembro de cada objeto: el nombre de los estudiantes cuyo apellido es García. Dado que currentStudent.First es una cadena, el tipo de datos de la secuencia devuelta por studentQuery3 es IEnumerable(Of String), una secuencia de cadenas. Como en ejemplos anteriores, la asignación del tipo de datos de studentQuery3 se deja en manos del compilador, que lo determinará mediante la inferencia de tipo de variable local.
Dim studentQuery3 = From currentStudent In students Where currentStudent.Last = "Garcia" Select currentStudent.First ' If you see too many results, comment out the previous ' For Each loops. For Each studentRecord In studentQuery3 Console.WriteLine(studentRecord) Next
Sitúe el puntero del mouse encima de studentQuery3 en el código para comprobar que el tipo asignado es IEnumerable(Of String).
Genere y ejecute la aplicación; para ello, presione CTRL+F5. Observe los resultados en la ventana de la consola.
Para crear un tipo anónimo en la cláusula Select
Agregue el código de esta sección para ver cómo se utilizan los tipos anónimos en las consultas. Se utilizan en las consultas cuando se desea devolver varios campos del origen de datos en lugar de registros completos (registros currentStudent en los ejemplos anteriores) o campos únicos (First en la sección anterior). En lugar de definir un nuevo tipo con nombre que contenga los campos que desee incluir en el resultado, los campos se especifican en la cláusula Select y el compilador crea un tipo anónimo con esos campos como propiedades. Para obtener más información, vea Tipos anónimos (Visual Basic).
En el ejemplo siguiente se crea una consulta que devuelve el nombre y la condición de estudiante matriculado en el último año de estudios (senior) cuyo grado académico esté entre 1 y 10, por orden de grado académico. En este ejemplo, el tipo de studentQuery4 se debe deducir, porque la cláusula Select devuelve una instancia de tipo anónimo, y un tipo anónimo no tiene ningún nombre utilizable.
Dim studentQuery4 = From currentStudent In students Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10 Order By currentStudent.Rank Ascending Select currentStudent.First, currentStudent.Last, currentStudent.Rank ' If you see too many results, comment out the previous ' For Each loops. For Each studentRecord In studentQuery4 Console.WriteLine(studentRecord.Last & ", " & studentRecord.First & ": " & studentRecord.Rank) Next
Genere y ejecute la aplicación; para ello, presione CTRL+F5. Observe los resultados en la ventana de la consola.
Ejemplos adicionales
Ahora que ya comprende los conceptos básicos, aquí tiene una lista de ejemplos adicionales que ilustran la flexibilidad y eficacia de las consultas LINQ. Cada ejemplo va precedido de una breve descripción de lo que hace. Sitúe el puntero del mouse encima de la variable de resultado de cada consulta para ver el tipo deducido. Use un bucle For Each para generar los resultados.
' Find all students who are seniors.
Dim q1 = From currentStudent In students
Where currentStudent.Year = "Senior"
Select currentStudent
' Write a For Each loop to execute the query.
For Each q In q1
Console.WriteLine(q.First & " " & q.Last)
Next
' Find all students with a first name beginning with "C".
Dim q2 = From currentStudent In students
Where currentStudent.First.StartsWith("C")
Select currentStudent
' Find all top ranked seniors (rank < 40).
Dim q3 = From currentStudent In students
Where currentStudent.Rank < 40 And currentStudent.Year = "Senior"
Select currentStudent
' Find all seniors with a lower rank than a student who
' is not a senior.
Dim q4 = From student1 In students, student2 In students
Where student1.Year = "Senior" And student2.Year <> "Senior" And
student1.Rank > student2.Rank
Select student1
Distinct
' Retrieve the full names of all students, sorted by last name.
Dim q5 = From currentStudent In students
Order By currentStudent.Last
Select Name = currentStudent.First & " " & currentStudent.Last
' Determine how many students are ranked in the top 20.
Dim q6 = Aggregate currentStudent In students
Where currentStudent.Rank <= 20
Into Count()
' Count the number of different last names in the group of students.
Dim q7 = Aggregate currentStudent In students
Select currentStudent.Last
Distinct
Into Count()
' Create a list box to show the last names of students.
Dim lb As New System.Windows.Forms.ListBox
Dim q8 = From currentStudent In students
Order By currentStudent.Last
Select currentStudent.Last Distinct
For Each nextName As String In q8
lb.Items.Add(nextName)
Next
' Find every process that has a lowercase "h", "l", or "d" in its name.
Dim letters() As String = {"h", "l", "d"}
Dim q9 = From proc In System.Diagnostics.Process.GetProcesses,
letter In letters
Where proc.ProcessName.Contains(letter)
Select proc
For Each proc In q9
Console.WriteLine(proc.ProcessName & ", " & proc.WorkingSet64)
Next
Información adicional
Una vez que esté familiarizado con los conceptos básicos del uso de consultas, estará preparado para leer la documentación y ver los ejemplos del tipo de proveedor LINQ específico que le interese:
Vea también
Tareas
Tutorial: Escribir consultas en C# (LINQ)
Conceptos
Recursos suplementarios de LINQ
Inferencia de tipo de variable local (Visual Basic)
Inicializadores de objeto: Tipos con nombre y anónimos (Visual Basic)
Introducción a LINQ en Visual Basic
Otros recursos
LINQ (Language-Integrated Query)
Introducción a LINQ en Visual Basic
Historial de cambios
Fecha |
Historial |
Motivo |
---|---|---|
Mayo de 2011 |
Revisada la sección "Crear un proyecto". |
Corrección de errores de contenido. |