Operaciones básicas de consulta (Visual Basic)Basic Query Operations (Visual Basic)

En este tema se proporciona una breve Language-Integrated Query (LINQ)Language-Integrated Query (LINQ) Introducción a las expresiones de Visual Basic y a algunos de los tipos de operaciones típicas que se realizan en una consulta.This topic provides a brief introduction to Language-Integrated Query (LINQ)Language-Integrated Query (LINQ) expressions in Visual Basic, and to some of the typical kinds of operations that you perform in a query. Para obtener más información, vea los temas siguientes:For more information, see the following topics:

Introducción a LINQ en Visual BasicIntroduction to LINQ in Visual Basic

ConsultasQueries

Tutorial: Escribir consultas en Visual BasicWalkthrough: Writing Queries in Visual Basic

Especificar el origen de datos (desde)Specifying the Data Source (From)

En una LINQLINQ consulta, el primer paso es especificar el origen de datos que desea consultar.In a LINQLINQ query, the first step is to specify the data source that you want to query. Por lo tanto From , la cláusula en una consulta siempre aparece primero.Therefore, the From clause in a query always comes first. Los operadores de consulta seleccionan y dan forma al resultado en función del tipo de origen.Query operators select and shape the result based on the type of the source.

Dim query = From cust In customers
'           ...

La From cláusula especifica el origen de datos customers,, y una variable de cust rango,.The From clause specifies the data source, customers, and a range variable, cust. La variable de rango es como una variable de iteración de bucle, salvo que en una expresión de consulta no se produce ninguna iteración real.The range variable is like a loop iteration variable, except that in a query expression, no actual iteration occurs. Cuando se ejecuta la consulta, a menudo con un For Each bucle, la variable de rango sirve como referencia a cada elemento sucesivo en customers.When the query is executed, often by using a For Each loop, the range variable serves as a reference to each successive element in customers. Dado que el compilador puede deducir el tipo de cust, no tiene que especificarlo explícitamente.Because the compiler can infer the type of cust, you do not have to specify it explicitly. Para obtener ejemplos de consultas escritas con y sin tipos explícitos, vea relaciones de tipos en operaciones de consulta (Visual Basic).For examples of queries written with and without explicit typing, see Type Relationships in Query Operations (Visual Basic).

Para obtener más información sobre cómo usar la From cláusula en Visual Basic, consulte from (cláusula).For more information about how to use the From clause in Visual Basic, see From Clause.

Filtrar datos (dónde)Filtering Data (Where)

Probablemente, la operación de consulta más común es aplicar un filtro en forma de expresión booleana.Probably the most common query operation is applying a filter in the form of a Boolean expression. A continuación, la consulta devuelve solo los elementos para los que la expresión es verdadera.The query then returns only those elements for which the expression is true. Una Where cláusula se usa para realizar el filtrado.A Where clause is used to perform the filtering. El filtro especifica los elementos del origen de datos que se van a incluir en la secuencia resultante.The filter specifies which elements in the data source to include in the resulting sequence. En el ejemplo siguiente, solo se incluyen los clientes que tienen una dirección en Londres.In the following example, only those customers who have an address in London are included.

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
'                 ...

Puede utilizar operadores lógicos como And y Or para combinar expresiones de filtro en una Where cláusula.You can use logical operators such as And and Or to combine filter expressions in a Where clause. Por ejemplo, para devolver solo los clientes que son de Londres y cuyo nombre es Devon, use el código siguiente:For example, to return only those customers who are from London and whose name is Devon, use the following code:

Where cust.City = "London" And cust.Name = "Devon"   

Para devolver los clientes de Londres o París, use el código siguiente:To return customers from London or Paris, use the following code:

Where cust.City = "London" Or cust.City = "Paris"   

Para obtener más información sobre cómo usar la Where cláusula en Visual Basic, vea cláusula WHERE.For more information about how to use the Where clause in Visual Basic, see Where Clause.

Datos de ordenación (order by)Ordering Data (Order By)

A menudo resulta cómodo ordenar los datos devueltos en un orden determinado.It often is convenient to sort returned data into a particular order. La Order By cláusula hará que los elementos de la secuencia devuelta se ordenen en un campo o campos especificados.The Order By clause will cause the elements in the returned sequence to be sorted on a specified field or fields. Por ejemplo, la siguiente consulta ordena los resultados en función de Name la propiedad.For example, the following query sorts the results based on the Name property. Dado Name que es una cadena, los datos devueltos se ordenarán alfabéticamente, de la a a la Z.Because Name is a string, the returned data will be sorted alphabetically, from A to Z.

Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
'                   ...

Para ordenar los resultados en orden inverso, de la Z a la A, use la cláusula Order By...Descending.To order the results in reverse order, from Z to A, use the Order By...Descending clause. El valor predeterminado Ascending es Ascending cuando no Descending se especifica ni.The default is Ascending when neither Ascending nor Descending is specified.

Para obtener más información sobre cómo usar la Order By cláusula en Visual Basic, consulte cláusula order by.For more information about how to use the Order By clause in Visual Basic, see Order By Clause.

Seleccionar datos (Select)Selecting Data (Select)

La Select cláusula especifica la forma y el contenido de los elementos devueltos.The Select clause specifies the form and content of returned elements. Por ejemplo, puede especificar si los resultados se componen de Customer objetos completos, Customer una sola propiedad, un subconjunto de propiedades, una combinación de propiedades de varios orígenes de datos o algún nuevo tipo de resultado basado en un cálculo.For example, you can specify whether your results will consist of complete Customer objects, just one Customer property, a subset of properties, a combination of properties from various data sources, or some new result type based on a computation. Cuando la cláusula Select genera algo distinto de una copia del elemento de origen, la operación se denomina proyección.When the Select clause produces something other than a copy of the source element, the operation is called a projection.

Para recuperar una colección que consta de objetos Customer completos, seleccione la variable de rango en sí:To retrieve a collection that consists of complete Customer objects, select the range variable itself:

Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust

Si una Customer instancia es un objeto grande que tiene muchos campos y todo lo que desea recuperar es el nombre, puede seleccionar cust.Name, tal y como se muestra en el ejemplo siguiente.If a Customer instance is a large object that has many fields, and all that you want to retrieve is the name, you can select cust.Name, as shown in the following example. La inferencia de tipo local reconoce que esto cambia el tipo de resultado de Customer una colección de objetos a una colección de cadenas.Local type inference recognizes that this changes the result type from a collection of Customer objects to a collection of strings.

Dim londonCusts3 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust.Name

Para seleccionar varios campos del origen de datos, tiene dos opciones:To select multiple fields from the data source, you have two choices:

  • En la Select cláusula, especifique los campos que desea incluir en el resultado.In the Select clause, specify the fields you want to include in the result. El compilador definirá un tipo anónimo que tiene esos campos como sus propiedades.The compiler will define an anonymous type that has those fields as its properties. Para más información, vea Tipos anónimos.For more information, see Anonymous Types.

    Dado que los elementos devueltos en el ejemplo siguiente son instancias de un tipo anónimo, no se puede hacer referencia al tipo por su nombre en ningún lugar del código.Because the returned elements in the following example are instances of an anonymous type, you cannot refer to the type by name elsewhere in your code. El nombre designado por el compilador para el tipo contiene caracteres que no son válidos en el código de Visual Basic normal.The compiler-designated name for the type contains characters that are not valid in normal Visual Basic code. En el ejemplo siguiente, los elementos de la colección devueltos por la consulta en londonCusts4 son instancias de un tipo anónimo.In the following example, the elements in the collection that is returned by the query in londonCusts4 are instances of an anonymous type

    Dim londonCusts4 = From cust In customers
                       Where cust.City = "London"
                       Order By cust.Name Ascending
                       Select Name = cust.Name, Phone = cust.Phone
    
    For Each londonCust In londonCusts4
        Console.WriteLine(londonCust.Name & " " & londonCust.Phone)
    Next
    

    -o bien--or-

  • Defina un tipo con nombre que contenga los campos concretos que desea incluir en el resultado y cree e inicialice instancias del tipo en la Select cláusula.Define a named type that contains the particular fields that you want to include in the result, and create and initialize instances of the type in the Select clause. Utilice esta opción solo si tiene que utilizar resultados individuales fuera de la colección en la que se devuelven, o bien, si tiene que pasarlos como parámetros en las llamadas de método.Use this option only if you have to use individual results outside the collection in which they are returned, or if you have to pass them as parameters in method calls. El tipo de londonCusts5 en el ejemplo siguiente es IEnumerable (of NamePhone).The type of londonCusts5 in the following example is IEnumerable(Of NamePhone).

    Public Class NamePhone
        Public Name As String
        Public Phone As String
        ' Additional class elements
    End Class
    
    Dim londonCusts5 = From cust In customers
                       Where cust.City = "London"
                       Order By cust.Name Ascending
                       Select New NamePhone With {.Name = cust.Name,
                                                  .Phone = cust.Phone}
    

Para obtener más información sobre cómo usar la Select cláusula en Visual Basic, consulte cláusula SELECT.For more information about how to use the Select clause in Visual Basic, see Select Clause.

Combinar datos (combinación y combinación de grupo)Joining Data (Join and Group Join)

Puede combinar más de un origen de datos en la From cláusula de varias maneras.You can combine more than one data source in the From clause in several ways. Por ejemplo, el código siguiente usa dos orígenes de datos y combina implícitamente las propiedades de ambos en el resultado.For example, the following code uses two data sources and implicitly combines properties from both of them in the result. La consulta selecciona estudiantes cuyos apellidos empiezan por una vocal.The query selects students whose last names start with a vowel.

Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
                 Where student.Last.IndexOf(vowel) = 0
                 Select Name = student.First & " " &
                 student.Last, Initial = vowel
                 Order By Initial

For Each vName In vowelNames
    Console.WriteLine(vName.Initial & ":  " & vName.Name)
Next

Nota

Puede ejecutar este código con la lista de estudiantes creados en cómo: Cree una lista de elementos.You can run this code with the list of students created in How to: Create a List of Items.

La Join palabra clave es equivalente INNER JOIN a en SQL.The Join keyword is equivalent to an INNER JOIN in SQL. Combina dos colecciones en función de los valores de clave coincidentes entre los elementos de las dos colecciones.It combines two collections based on matching key values between elements in the two collections. La consulta devuelve todos o parte de los elementos de la colección que tienen valores de clave coincidentes.The query returns all or part of the collection elements that have matching key values. Por ejemplo, el código siguiente duplica la acción de la combinación implícita anterior.For example, the following code duplicates the action of the previous implicit join.

Dim vowelNames2 = From student In students
                  Join vowel In vowels
                  On student.Last(0) Equals vowel
                  Select Name = student.First & " " &
                  student.Last, Initial = vowel
                  Order By Initial

Group Joincombina colecciones en una sola colección jerárquica, al LEFT JOIN igual que en SQL.Group Join combines collections into a single hierarchical collection, just like a LEFT JOIN in SQL. Para obtener más información, vea cláusula join y Group join.For more information, see Join Clause and Group Join Clause.

Agrupar datos (agrupar por)Grouping Data (Group By)

Puede Agregar una Group By cláusula para agrupar los elementos del resultado de una consulta de acuerdo con uno o varios campos de los elementos.You can add a Group By clause to group the elements in a query result according to one or more fields of the elements. Por ejemplo, el código siguiente agrupa estudiantes por año de clase.For example, the following code groups students by class year.

Dim studentsByYear = From student In students
                     Select student
                     Group By year = student.Year
                     Into Classes = Group

For Each yearGroup In studentsByYear
    Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
    For Each student In yearGroup.Classes
        Console.WriteLine("   " & student.Last & ", " & student.First)
    Next
Next

Si ejecuta este código mediante la lista de estudiantes creados en cómo: Crear una lista de elementos, la salida de la For Each instrucción es:If you run this code using the list of students created in How to: Create a List of Items, the output from the For Each statement is:

Anual VeleYear: Junior

Tucker, MichaelTucker, Michael

Garcia, HugoGarcia, Hugo

Garcia, DebraGarcia, Debra

Tucker, lanceTucker, Lance

Anual JerarquíaYear: Senior

Omelchenko, SvetlanaOmelchenko, Svetlana

Osada, MichikoOsada, Michiko

Fakhouri, FadiFakhouri, Fadi

Feng, HanyingFeng, Hanying

Adams, TerryAdams, Terry

Anual ActualizaciónYear: Freshman

Mortensen, SvenMortensen, Sven

Garcia, CesarGarcia, Cesar

La variación que se muestra en el código siguiente ordena los años de la clase y, a continuación, ordena los estudiantes de cada año por Apellido.The variation shown in the following code orders the class years, and then orders the students within each year by last name.

Dim studentsByYear2 = From student In students
                      Select student
                      Order By student.Year, student.Last
                      Group By year = student.Year
                      Into Classes = Group

Para obtener más información Group Bysobre, vea cláusula Group by.For more information about Group By, see Group By Clause.

Vea tambiénSee also