Tutorial: Escribir consultas en Visual Basic

Actualización: noviembre 2007

Este tutorial le guiará a través de las nuevas características del lenguaje de Visual Basic 2008 y le mostrará cómo se utilizan 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 tipo 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 ver una demostración en vídeo, visite Video How to: Writing Queries in Visual Basic.

Crear un proyecto

Para crear un proyecto orientado a la versión 3.5 o posterior de .NET Framework

  1. Inicie Visual Studio 2008.

  2. En el menú Archivo, haga clic en Nuevo proyecto.

  3. Haga clic en Aplicación de consola y, a continuación, en Aceptar.

    Se crea un proyecto. De forma predeterminada, contiene una referencia a System.Core.dll y una instrucción Imports para el espacio de nombres System.Linq, ambas necesarias para ejecutar consultas 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.

    Nota 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, que son nuevos en Visual Basic 2008. Para obtener más información, consulte Inicializadores de objeto: Tipos con nombre y anónimos.

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. 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

  1. 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
    
  2. 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

  1. 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
    
  2. 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.

  3. 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 explorar 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

  1. 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 _
    
  2. 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.

  3. 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

  1. 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
    
  2. 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

  1. 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
    
  2. Sitúe el puntero del mouse encima de studentQuery3 en el código para comprobar que el tipo asignado es IEnumerable(Of String).

  3. 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

  1. Agregue el código de esta sección para ver cómo se utilizan los tipos anónimos en las consultas. Los tipos anónimos son una nueva característica de Visual Basic 2008. 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.

    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
    
  2. 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. Utilice 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:

LINQ to Objects

LINQ to SQL

LINQ to XML

LINQ to DataSet

Vea también

Tareas

Ejemplos de consultas (Visual Basic)

Conceptos

Recursos suplementarios de LINQ

Inferencia de tipo de variable local

Inicializadores de objeto: Tipos con nombre y anónimos

Tipos anónimos

Introducción a LINQ en Visual Basic

Otros recursos

Language-Integrated Query (LINQ)

Introducción a LINQ en Visual Basic

LINQ en Visual Basic

Consultas (Visual Basic)