Compartilhar via


Operações de consulta básica (Visual Basic)

Esse tópico fornece uma breve introdução a expressões LINQ (consulta integrada à linguagem) do Visual Basic e a alguns dos tipos de operação típicos realizados em uma consulta. Para obter mais informações, consulte estes tópicos:

Introdução a LINQ no Visual Basic

Consultas

Instruções passo a passo: escrevendo consultas em Visual Basic

Especificando a Fonte de Dados (De)

Em uma consulta LINQ, a primeira etapa é especificar a fonte de dados que você deseja consultar. Portanto, a cláusula From em uma consulta sempre vem primeiro. Os operadores de consulta selecionam e moldam o resultado com base no tipo da origem.

Dim query = From cust In customers
'           ...

A cláusula From especifica a fonte de dados, customers, e uma variável de intervalo, cust. A variável de intervalo é como uma variável de iteração de loop, exceto que, em uma expressão de consulta, nenhuma iteração real ocorre. Quando a consulta é executada, muitas vezes usando um loop For Each, a variável de intervalo servirá como uma referência para cada elemento sucessivo em customers. Uma vez que o compilador pode inferir o tipo de cust, você não precisa especificá-lo explicitamente. Para obter exemplos de consultas escritas com e sem digitação explícita, confira Relações de Tipo em Operações de Consulta (Visual Basic).

Para obter mais informações sobre como usar a cláusula From no Visual Basic, confira From Clause.

Filtrando Dados (Onde)

Provavelmente, a operação de consulta mais comum é aplicar um filtro no formulário de uma expressão booliana. A consulta retorna apenas os elementos para os quais a expressão é verdadeira. Uma cláusula Where é usada para executar a filtragem. O filtro especifica quais elementos na fonte de dados serão incluídos na sequência resultante. No exemplo a seguir, somente os clientes que têm um endereço em Londres são incluídos.

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

Você pode usar operadores lógicos como And e Or para combinar expressões de filtro em uma cláusula Where. Por exemplo, para retornar somente os clientes que são de Londres e cujo nome é Devon, use o seguinte código:

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

Para retornar clientes de Londres ou Paris, use o seguinte código:

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

Para obter mais informações sobre como usar a cláusula Where no Visual Basic, confira Where Clause.

Ordenando Dados (Ordenar Por)

Geralmente, é conveniente classificar os dados retornados em uma ordem específica. A cláusula Order By fará com que os elementos na sequência retornada sejam classificados em um campo ou campos especificados. Por exemplo, a consulta a seguir pode ser estendida para classificar os resultados com base na propriedade Name. Como Name é uma cadeia de caracteres, os dados retornados serão classificados em ordem alfabética, de A a Z.

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

Para ordenar os resultados na ordem inversa, de Z para a, use a cláusula Order By...Descending. O padrão é Ascending quando nem Ascending nem Descending é especificado.

Para obter mais informações sobre como usar a cláusula Order By no Visual Basic, confira Order By Clause.

Selecionando Dados (Selecionar)

A cláusula Select especifica a forma e o conteúdo dos elementos retornados. Por exemplo, você pode especificar se os resultados consistirão em objetos Customer completos, apenas uma propriedade Customer, um subconjunto de propriedades, uma combinação de propriedades de várias fontes de dados ou algum novo tipo de resultado com base em uma computação. Quando a cláusula Select produz algo diferente de uma cópia do elemento de origem, a operação é chamada de projeção.

Para recuperar uma coleção que consiste em objetos Customer completos, selecione a própria variável de intervalo:

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

Se uma instância Customer for um objeto grande que tenha muitos campos, e tudo o que você deseja recuperar é o nome, você poderá selecionar cust.Name, conforme mostrado no exemplo a seguir. A inferência de tipo local reconhece que isso altera o tipo de resultado de uma coleção de objetos Customer para uma coleção de cadeias de caracteres.

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

Para selecionar vários campos na fonte de dados, você tem duas opções:

  • Na cláusula Select, especifique os campos que deseja incluir no resultado. O compilador definirá um tipo anônimo que tem esses campos como suas propriedades. Para obter mais informações, consulte Tipos Anônimos.

    Como os elementos retornados no exemplo a seguir são instâncias de um tipo anônimo, você não pode fazer referência ao tipo por nome em outro lugar do seu código. O nome designado pelo compilador para o tipo contém caracteres que não são válidos no código do Visual Basic normal. No exemplo a seguir, os elementos na coleção que é retornada pela consulta em londonCusts4 são instâncias de um tipo anônimo

    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
    

    -ou-

  • Defina um tipo nomeado que contenha os campos específicos que você deseja incluir no resultado e crie e inicialize instâncias do tipo na cláusula Select. Use essa opção somente se você precisar usar resultados individuais fora da coleção na qual eles são retornados ou se precisar passá-los como parâmetros em chamadas de método. O tipo de londonCusts5 no exemplo a seguir é 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 obter mais informações sobre como usar a cláusula Select no Visual Basic, confira Select Clause.

Ingressando Dados (Ingressar e Agrupar Junções)

Você pode combinar mais de uma fonte de dados na cláusula From de várias maneiras. Por exemplo, o código a seguir usa duas fontes de dados e combina implicitamente as propriedades de ambas no resultado. A consulta seleciona os alunos cujos sobrenomes começam com uma vogal.

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

Observação

Você pode executar esse código com a lista de alunos criados em Como criar uma lista de itens.

A palavra-chave Join é equivalente a um INNER JOIN no SQL. Ela combina duas coleções com base em valores de chave correspondentes entre elementos nas duas coleções. A consulta retorna todos ou parte dos elementos de coleção que têm valores de chave correspondentes. Por exemplo, o código a seguir duplica a ação da junção implícita anterior.

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 Join combina coleções em uma única coleção hierárquica, assim como um LEFT JOIN no SQL. Para obter mais informações, confira Join Clause e Group Join Clause.

Agrupando Dados (Agrupar Por)

Você pode adicionar uma cláusula Group By para agrupar os elementos em um resultado de consulta de acordo com um ou mais campos dos elementos. Por exemplo, o código a seguir agrupa alunos por ano da turma.

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

Se você executar esse código usando a lista de alunos criada em Como criar uma lista de itens, a saída da instrução For Each será:

Ano: Terceiro (Júnior)

Tucker, Michael

Garcia, Hugo

Garcia, Debra

Tucker, Lance

Ano: Quarto (Sênior)

Omelchenko, Svetlana

Osada, Michiko

Fakhouri, Fadi

Feng, Hanying

Adams, Terry

Ano: Primeiro (Freshman)

Mortensen, Sven

Garcia, Cesar

A variação mostrada no código a seguir ordena os anos por turma e, em seguida, ordena os alunos dentro de cada ano pelo sobrenome.

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

Para obter mais informações sobre Group By, confira Group By Clause.

Confira também