Compartir a través de


Tutorial: Escritura de consultas en Visual Basic

En este tutorial se muestra cómo puede usar las características del lenguaje Visual Basic para escribir expresiones de consulta de Language-Integrated Query (LINQ). En el tutorial se 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, como inicializadores de objetos, inferencia de tipos locales y tipos anónimos.

Después de completar este tutorial, estará listo para pasar a los ejemplos y la documentación del proveedor LINQ específico que le interesa. Los proveedores LINQ incluyen LINQ to SQL, LINQ to DataSet y LINQ to XML.

Crear un proyecto

Para crear un proyecto de aplicación de consola

  1. Inicie Visual Studio.

  2. En el menú Archivo , elija Nuevoy haga clic en Proyecto.

  3. En la lista Plantillas instaladas , haga clic en Visual Basic.

  4. 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. Además, la lista Espacios de nombres importados de la página Referencias, el Diseñador de proyectos (Visual Basic) incluye el System.Linq espacio de nombres.

  5. En Página Compilación, Diseñador de proyectos (Visual Basic), asegúrese de que Option Infer está establecido en Activado.

Incorporación de un origen de datos en memoria

El origen de datos de las consultas de este tutorial es una lista de Student objetos. Cada Student objeto contiene un nombre, un apellido, un año de clase y un rango académico en el cuerpo del alumno.

Para agregar el origen de datos

  • Defina una Student clase y cree una lista de instancias de la clase .

    Importante

    El código necesario para definir la Student clase y crear la lista usada en los ejemplos de tutorial se proporciona en How to: Create a List of Items. Puede copiarlo desde allí y pegarlo en el proyecto. El nuevo código reemplaza el código que apareció al crear el proyecto.

Para agregar un nuevo alumno a la lista de alumnos

Creación de una consulta

Cuando se ejecuta, la consulta agregada en esta sección genera una lista de los alumnos cuya clasificación académica las coloca en los diez primeros. Dado que la consulta selecciona el objeto completo Student cada vez, el tipo del resultado de la consulta es IEnumerable(Of Student). Sin embargo, el tipo de la consulta normalmente no se especifica en las definiciones de consulta. En su lugar, el compilador usa la inferencia de tipos locales para determinar el tipo. Para obtener más información, consulte Inferencia de tipos locales. La variable de intervalo de la consulta, currentStudent, actúa como referencia a cada Student instancia del origen, students, proporcionando acceso a las propiedades de cada objeto de students.

Para crear una consulta sencilla

  1. Busque el lugar en el método Main del proyecto marcado de la siguiente 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.

    Dim studentQuery = From currentStudent In students
                       Where currentStudent.Rank <= 10
                       Select currentStudent
    
  2. Descanse el puntero del ratón sobre studentQuery en su código para comprobar que el tipo asignado por el compilador es IEnumerable(Of Student).

Ejecución de la consulta

La variable studentQuery contiene la definición de la consulta, no los resultados de ejecutar la consulta. Un mecanismo típico para ejecutar una consulta es un For Each bucle. Se obtiene acceso a cada elemento de la secuencia devuelta a través de la variable de iteración de bucle. Para obtener más información sobre la ejecución de consultas, consulte Escritura de la primera consulta LINQ.

Para ejecutar la consulta

  1. Agregue el siguiente For Each bucle debajo de la consulta en el proyecto.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Coloque el puntero del mouse sobre la variable de control studentRecord del bucle para ver su tipo de datos. El tipo de studentRecord se deduce como Student, porque studentQuery devuelve una colección de Student instancias.

  3. Compile y ejecute la aplicación presionando CTRL+F5. Anote los resultados en la ventana de la consola.

Modificación de la consulta

Es más fácil examinar los resultados de la consulta si están en un orden especificado. Puede ordenar la secuencia devuelta en función de cualquier campo disponible.

Para ordenar los resultados

  1. Agregue la siguiente cláusula Order By entre la instrucción Where y la instrucción Select en la consulta. La Order By cláusula ordenará los resultados alfabéticamente de A a Z, según el apellido de cada alumno.

    Order By currentStudent.Last Ascending
    
  2. Para ordenar por apellido y, a continuación, nombre, agregue ambos campos a la consulta:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    También puede especificar Descending para ordenar de Z a A.

  3. Compile y ejecute la aplicación presionando CTRL+F5. Anote los resultados en la ventana de la consola.

Para introducir un identificador local

  1. Agregue el código de esta sección para introducir 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 de los nombres y apellidos del alumno. Un identificador local se puede usar para mayor comodidad o puede mejorar el rendimiento almacenando los resultados de una expresión que, de lo contrario, 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. Compile y ejecute la aplicación presionando CTRL+F5. Anote 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 Student objetos, pero solo se devuelve un miembro de cada objeto: el nombre de los alumnos cuyo apellido es Garcia. 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 los ejemplos anteriores, la asignación de un tipo de datos para studentQuery3 se deja para que el compilador determine mediante la inferencia de tipos locales.

    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. Coloque el puntero del ratón sobre studentQuery3 en su código para comprobar que el tipo asignado es IEnumerable(Of String).

  3. Compile y ejecute la aplicación presionando CTRL+F5. Anote 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 usan los tipos anónimos en las consultas. Los usa en consultas cuando desea devolver varios campos del origen de datos en lugar de completar registros (currentStudent registros en 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 desea incluir en el resultado, especifique los campos de la Select cláusula y el compilador crea un tipo anónimo con esos campos como sus propiedades. Para obtener más información, consulte Tipos anónimos (Guía de programación de C#).

    En el ejemplo siguiente se crea una consulta que devuelve el nombre y la clasificación de los ancianos cuyo rango académico está comprendido entre 1 y 10, en orden de clasificación académica. En este ejemplo, el tipo de studentQuery4 debe inferirse porque la Select cláusula devuelve una instancia de un tipo anónimo y un tipo anónimo no tiene 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. Compile y ejecute la aplicación presionando CTRL+F5. Anote los resultados en la ventana de la consola.

Ejemplos adicionales

Ahora que comprende los conceptos básicos, a continuación se muestra una lista de ejemplos adicionales para ilustrar la flexibilidad y la eficacia de las consultas LINQ. Cada ejemplo va precedido de una breve descripción de lo que hace. Deje el puntero del ratón sobre la variable de resultado de cada consulta para ver el tipo inferido. Use un For Each bucle 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 de trabajar con consultas, estará listo para leer la documentación y los ejemplos del tipo específico de proveedor LINQ que le interese:

Consulte también