Eventos
Compilación de Intelligent Apps
17 mar, 21 - 21 mar, 10
Únase a la serie de reuniones para crear soluciones de inteligencia artificial escalables basadas en casos de uso reales con compañeros desarrolladores y expertos.
Regístrese ahoraEste explorador ya no se admite.
Actualice a Microsoft Edge para aprovechar las características y actualizaciones de seguridad más recientes, y disponer de soporte técnico.
En este tutorial se muestra cómo se pueden usar 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 sobre 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 tipo de variable local y tipos anónimos.
Después de terminar este tutorial estará listo para pasar a los ejemplos y la documentación del proveedor LINQ específico que le interese. Los proveedores LINQ incluyen LINQ to SQL, LINQ to DataSet y LINQ to XML.
Inicie Visual Studio.
En el menú Archivo , elija Nuevoy 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 haga clic en Aceptar.
Se crea un proyecto. De manera predeterminada, contiene una referencia a System.Core.dll. Además, la lista Espacios de nombres importados de Página Referencias, Diseñador de proyectos (Visual Basic) incluye el espacio de nombres System.Linq.
En Página Compilación, Diseñador de proyectos (Visual Basic), asegúrese de que Option Infer está establecido en Activado.
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 académico y una clasificación académica en el cuerpo del alumno.
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 usada en los ejemplos del tutorial se proporciona en Procedimiento para crear una lista de elementos. Puede copiarlo desde allí y pegarlo en el proyecto. El nuevo código reemplaza al que aparecía al crear el proyecto.
getStudents
para agregar otra instancia de la clase Student
a la lista. Al agregar el alumno se le presentan los inicializadores de objetos. Para obtener más información, vea Inicializadores de objeto: Tipos con nombre y anónimos.Cuando se ejecuta, la consulta agregada en esta sección genera una lista de los alumnos cuya clasificación académica los coloca entre 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)
. Pero el tipo de la consulta normalmente no se especifica en las definiciones de consulta. En su lugar, el compilador usa la inferencia de tipo de variable local para determinar el tipo. Para obtener más información, vea Inferencia de tipo de variable local. La variable de rango de la consulta, currentStudent
, sirve como referencia a cada instancia Student
del origen, students
, con lo que proporciona acceso a las propiedades de cada objeto de students
.
Busque el lugar en el método Main
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 siguiente código y péguelo.
Dim studentQuery = From currentStudent In students
Where currentStudent.Rank <= 10
Select currentStudent
Coloque el puntero del mouse sobre studentQuery
en el código para comprobar que el tipo asignado por el compilador es IEnumerable(Of Student)
.
La variable studentQuery
contiene la definición de la consulta, no los resultados de su ejecución. Un mecanismo típico para ejecutar una consulta es un bucle For Each
. A cada elemento de la secuencia devuelta se accede mediante la variable de iteración del bucle. Para obtener más información sobre la ejecución de consultas, vea Escritura de la primera consulta con LINQ.
Agregue el siguiente bucle For Each
debajo de la consulta en el proyecto.
For Each studentRecord In studentQuery
Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
Next
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 instancias Student
.
Compile y ejecute la aplicación; para ello, presione CTRL+F5. Observe los resultados en la ventana de la consola.
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.
Agregue la cláusula siguiente Order By
entre la instrucción Where
y la instrucción Select
de la consulta. La cláusula Order By
ordena los resultados alfabéticamente de A a Z por el apellido de cada alumno.
Order By currentStudent.Last Ascending
Para ordenar por apellido y luego por 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.
Compile y ejecute la aplicación; para ello, presione CTRL+F5. Observe los resultados en la ventana de la consola.
Agregue el código de esta sección para incorporar un identificador local en la expresión de consulta. El identificador local contiene un resultado intermedio. En el ejemplo siguiente, name
es un identificador que contiene una concatenación de los nombres y apellidos de los alumnos. Un identificador local se puede usar por comodidad, o puede mejorar el rendimiento al almacenar 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
Compile y ejecute la aplicación; para ello, presione CTRL+F5. Observe los resultados en la ventana de la consola.
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 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
la determina el compilador 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
Coloque el puntero del mouse sobre studentQuery3
en el código para comprobar que el tipo asignado es IEnumerable(Of String)
.
Compile y ejecute la aplicación; para ello, presione CTRL+F5. Observe los resultados en la ventana de la consola.
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 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 se quieren incluir en el resultado, se especifican los campos de la cláusula Select
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 mayores cuya clasificación académica está comprendida entre 1 y 10, por orden de clasificación académica. En este ejemplo se debe deducir el tipo de studentQuery4
porque la cláusula Select
devuelve una instancia de un 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
Compile y ejecute la aplicación; para ello, presione CTRL+F5. Observe los resultados en la ventana de la consola.
Ahora que entiende los aspectos básicos, a continuación se muestra una lista de ejemplos adicionales para ilustrar la flexibilidad y la eficacia de las consultas de LINQ. Cada ejemplo va precedido de una breve descripción de lo que hace. Coloque el puntero del mouse sobre la variable de resultado de la consulta 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
Cuando se haya familiarizado con los aspectos básicos del trabajo con consultas, estará preparado para leer la documentación y los ejemplos del tipo específico de proveedor LINQ que le interese:
Comentarios de .NET
.NET es un proyecto de código abierto. Seleccione un vínculo para proporcionar comentarios:
Eventos
Compilación de Intelligent Apps
17 mar, 21 - 21 mar, 10
Únase a la serie de reuniones para crear soluciones de inteligencia artificial escalables basadas en casos de uso reales con compañeros desarrolladores y expertos.
Regístrese ahoraCursos
Módulo
Trabajar con consultas en Dynamics 365 Business Central - Training
Aprenda a trabajar con el objeto Consulta en Dynamics 365 Business Central para unir, filtrar y agregar datos.
Certificación
Microsoft Certified: Azure Cosmos DB Developer Specialty - Certifications
Escribe consultas eficaces, crea directivas de indexación, administra y aprovisiona recursos en la API de SQL y el SDK con Microsoft Azure Cosmos DB.