Tutorial: Escribir consultas en Visual Basic
En este tutorial se muestra cómo puede usar las características Visual Basic lenguaje para escribir expresiones de consulta 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, incluidos los inicializadores de objeto, la inferencia de tipos locales y los 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 LINQ to SQL incluyen , LINQ to DataSet y LINQ to XML.
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 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. Además, la lista Espacios de nombres importados de la página Referencias, Project Designer (Visual Basic) incluye el espacio de System.Linq nombres .
En la página Compilar, Project designer (Visual Basic), asegúrese de que Option infer esté establecido en On.
Agregar un origen In-Memory datos de datos
El origen de datos de las consultas de este tutorial es una lista de Student objetos . Cada objeto contiene un nombre, un apellido, un año de clase y un Student rango académico en el cuerpo del alumno.
Para agregar el origen de datos
Defina una
Studentclase y cree una lista de instancias de la clase .Importante
El código necesario para definir la clase y crear la lista usada en los ejemplos del tutorial se proporciona en
StudentCómo: Crear una lista de elementos. 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
- Siga el patrón del método
getStudentspara agregar otra instancia de la clase a laStudentlista. Al agregar el alumno, se presentarán los inicializadores de objeto. Para obtener más información, vea Inicializadores de objeto: tipos con nombre y anónimos.
Crear una consulta
Cuando se ejecuta, la consulta agregada en esta sección genera una lista de los alumnos cuyo rango académico los coloca entre los diez primeros. Dado que la consulta selecciona el objeto Student completo 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 local para determinar el tipo. Para obtener más información, vea Inferencia de tipo local. La variable de intervalo de la consulta, , actúa como referencia a cada instancia del origen, , lo que proporciona acceso a las propiedades currentStudent de cada objeto en Student students students .
Para crear una consulta simple
Busque el lugar en
Mainel método del proyecto marcado como sigue:' ****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 currentStudentColoque el puntero del mouse
studentQueryen el código para comprobar que el tipo asignado por el compilador esIEnumerable(Of Student).
Ejecución de la consulta
La variable studentQuery contiene la definición de la consulta, no los resultados de la ejecución de la consulta. Un mecanismo típico para ejecutar una consulta es un For Each bucle . Se tiene 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, vea Writing Your First LINQ Query.
Para ejecutar la consulta
Agregue el siguiente
For Eachbucle debajo de la consulta en el proyecto.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) NextColoque el puntero del mouse sobre la variable de control de
studentRecordbucle para ver su tipo de datos. El tipo destudentRecordse deduce como , porque devuelve una colección de instancias deStudentstudentQueryStudent.Compile y ejecute la aplicación presionando CTRL+F5. Tenga en cuenta los resultados en la ventana de consola.
Modificar 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
Agregue la siguiente
Order Bycláusula entre la instrucción y la instrucción de laWhereSelectconsulta. LaOrder Bycláusula ordenará los resultados alfabéticamente de A a Z, según el apellido de cada alumno.Order By currentStudent.Last AscendingPara ordenar por apellido y, a continuación, por nombre, agregue ambos campos a la consulta:
Order By currentStudent.Last Ascending, currentStudent.First AscendingTambién puede especificar
Descendingpara ordenar de Z a A.Compile y ejecute la aplicación presionando CTRL+F5. Tenga en cuenta los resultados en la ventana de consola.
Para introducir un identificador local
Agregue el código de esta sección para introducir un identificador local en la expresión de consulta. El identificador local contendrán un resultado intermedio. En el ejemplo siguiente,
namees un identificador que contiene una concatenación de los nombres y apellidos del alumno. Un identificador local se puede usar por 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) NextCompile y ejecute la aplicación presionando CTRL+F5. Tenga en cuenta los resultados en la ventana de consola.
Para proyectar un campo en la cláusula Select
Agregue la consulta y el bucle de esta sección para crear una consulta que genera una secuencia cuyos elementos
For Eachdifieren de los elementos del origen. En el ejemplo siguiente, el origen es una colección de objetos, pero solo se devuelve un miembro de cada objeto: el nombre de los alumnos cuyo apellidoStudentes Juana. DadocurrentStudent.Firstque es una cadena, el tipo de datos de la secuencia devuelta por es , una secuencia destudentQuery3IEnumerable(Of String)cadenas. Como en los ejemplos anteriores, la asignación de un tipo de datos para se deja para que el compilador determine mediante el usostudentQuery3de la inferencia de tipos 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) NextColoque el puntero del mouse
studentQuery3sobre el código para comprobar que el tipo asignado esIEnumerable(Of String).Compile y ejecute la aplicación presionando CTRL+F5. Tenga en cuenta los resultados en la ventana de 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 usan los tipos anónimos en las consultas. Se usan en consultas cuando se quieren devolver varios campos del origen de datos en lugar de registros completos (registros en ejemplos anteriores) o campos únicos ( en
currentStudentFirstla 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 cláusula y el compilador crea un tipo anónimo con esos campos como susSelectpropiedades. 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 el rango de las personas mayores cuyo rango académico está entre 1 y 10, por orden de rango académico. En este ejemplo, se debe inferir el tipo de porque la cláusula devuelve una instancia de un tipo anónimo y un tipo anónimo
studentQuery4no tiene ningún nombreSelectutilizable.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) NextCompile y ejecute la aplicación presionando CTRL+F5. Tenga en cuenta los resultados en la ventana de consola.
Otros ejemplos
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. Rest the mouse pointer over the query result variable for each query to see the inferred type. 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 interesa: