Partilhar via


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

Este tópico fornece uma breve introdução às expressões LINQ (Language-Integrated Query) no Visual Basic e a alguns dos tipos típicos de operações que você executa em uma consulta. Para obter mais informações, consulte os tópicos seguintes:

Introdução ao LINQ no Visual Basic

Consultas

Passo a passo: Escrevendo consultas no 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 From cláusula em uma consulta sempre vem em primeiro lugar. Os operadores de consulta selecionam e moldam o resultado com base no tipo da fonte.

Dim query = From cust In customers
'           ...

A From cláusula especifica a fonte de dados, customerse uma variável de intervalo, cust. A variável range é 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, geralmente usando um For Each loop, a variável range serve como referência para cada elemento sucessivo no customers. Como 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, consulte Relações de tipo em operações de consulta (Visual Basic).

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

Filtrando dados (onde)

Provavelmente, a operação de consulta mais comum é a aplicação de um filtro na forma de uma expressão booleana. Em seguida, a consulta retorna apenas os elementos para os quais a expressão é verdadeira. Uma Where cláusula é usada para executar a filtragem. O filtro especifica quais elementos na fonte de dados devem ser incluídos na sequência resultante. No exemplo a seguir, apenas 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 Where cláusula. Por exemplo, para retornar apenas 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 Where cláusula no Visual Basic, consulte Cláusula Where.

Dados de encomenda (encomendar por)

Muitas vezes, é conveniente classificar os dados retornados em uma ordem específica. A Order By cláusula fará com que os elementos na sequência retornada sejam classificados em um campo ou campos especificados. Por exemplo, a consulta a seguir classifica os resultados com base na Name propriedade. 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 em ordem inversa, de Z para A, use a Order By...Descending cláusula. O padrão é Ascending quando nem Ascending nem Descending é especificado.

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

Seleção de dados (Selecionar)

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

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

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

Se uma Customer instância for um objeto grande com muitos campos e tudo o que você deseja recuperar for 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 Customer objetos 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 da fonte de dados, você tem duas opções:

  • Na cláusula, especifique os Select 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 se referir ao tipo por nome em outro lugar no código. O nome designado pelo compilador para o tipo contém caracteres que não são válidos no código normal do Visual Basic. 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
    

    -or-

  • 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 Select cláusula. Use essa opção somente se você tiver que usar resultados individuais fora da coleção na qual eles são retornados, ou se você tiver que passá-los como parâmetros em chamadas de método. O tipo de no exemplo a londonCusts5 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 Select cláusula no Visual Basic, consulte Select Clause.

Dados de Ingresso (Ingresso e Ingresso em Grupo)

Você pode combinar mais de uma fonte de dados na From cláusula de várias maneiras. Por exemplo, o código a seguir usa duas fontes de dados e combina implicitamente propriedades de ambas no resultado. A consulta seleciona 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

Nota

Você pode executar esse código com a lista de alunos criada em Como: Criar uma lista de itens.

A Join palavra-chave é equivalente a um INNER JOIN em SQL. Ele combina duas coleções com base na correspondência de valores-chave entre os elementos das duas coleções. A consulta retorna todos ou parte dos elementos da 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 em SQL. Para obter mais informações, consulte Cláusula de associação e Cláusula de associação de grupo.

Agrupamento de dados (agrupar por)

Você pode adicionar uma Group By cláusula 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 os alunos por ano letivo.

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 For Each instrução é:

Ano: Junior

Tucker, Miguel

Garcia, Hugo

Garcia, Debra

Tucker, Lance

Ano: Sénior

Omelchenko, Svetlana

Osada, Michiko

Fakhouri, Fadi

Feng, Hanying

Adams, Terry

Ano: Calouro

Mortensen, Sven

Garcia, César

A variação mostrada no código a seguir ordena os anos de aula 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 Byo , consulte Agrupar por cláusula.

Consulte também