Compartilhar via


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

Este passo a passo demonstra como você pode usar os recursos de linguagem do Visual Basic para gravar expressões de consulta LINQ (Consulta Integrada à Linguagem). O passo a passo demonstra como criar consultas em uma lista de objetos Estudante, como executar as consultas e como modificá-las. As consultas incorporam vários recursos, incluindo inicializadores de objeto, inferência de tipo de variável local e tipos anônimos.

Depois de concluir este passo a passo, você estará pronto para passar para os exemplos e a documentação do provedor LINQ específico no qual você está interessado. Os provedores LINQ incluem LINQ to SQL, LINQ to DataSet e LINQ to XML.

Criar um projeto

Para criar um projeto de aplicativo de console

  1. Inicie o Visual Studio.

  2. No menu Arquivo , aponte para Novoe clique em Projeto.

  3. Na lista Modelos Instalados, clique em Visual Basic.

  4. Na lista de tipos de projeto, clique em Aplicativo de console. Na caixa Nome, digite um nome para o projeto e clique em OK.

    Um projeto é criado. Por padrão, ele contém uma referência a System.Core.dll. Além disso, a lista de Namespaces importados na Página Referências, Designer de Projeto (Visual Basic) inclui o namespace System.Linq.

  5. Na Página de Compilação, Designer de Projeto (Visual Basic), verifique se a Opção Inferir está Ativada.

Adicionar uma Fonte de Dados na Memória

A fonte de dados para as consultas neste passo a passo é uma lista de objetos Student. Cada objeto Student contém um nome, um sobrenome, um ano de classe e uma classificação acadêmica no corpo do aluno.

Para adicionar a fonte de dados

  • Defina uma classe Student e crie uma lista de instâncias da classe.

    Importante

    O código necessário para definir a classe Student e criar a lista usada nos exemplos de passo a passo é fornecido em Como criar uma lista de itens. Você pode copiá-lo de lá e colá-lo no projeto. O novo código substitui o código que apareceu quando o projeto foi criado.

Para adicionar um novo aluno à lista de alunos

Criar uma consulta

Quando executada, a consulta adicionada nesta seção produz uma lista dos alunos cuja classificação acadêmica os coloca entre os dez primeiros. Como a consulta sempre seleciona o objeto completo Student, o tipo do resultado da consulta é IEnumerable(Of Student). No entanto, o tipo da consulta não costuma ser especificado nas definições de consulta. Em vez disso, o compilador usa a inferência de tipo de variável local para determinar o tipo. Para obter mais informações, confira Inferência de tipo de variável local. A variável de intervalo da consulta currentStudent, serve como uma referência a cada instância Student na origem students, fornecendo acesso às propriedades de cada objeto em students.

Para criar uma consulta simples

  1. Encontre o local no método Main do projeto que está marcado da seguinte maneira:

    ' ****Paste query and query execution code from the walkthrough,
    ' ****or any code of your own, here in Main.
    

    Copie o código a seguir e cole-o nele.

    Dim studentQuery = From currentStudent In students
                       Where currentStudent.Rank <= 10
                       Select currentStudent
    
  2. Coloque o ponteiro do mouse em studentQuery no código para verificar se o tipo atribuído ao compilador é IEnumerable(Of Student).

Executar a Consulta

A variável studentQuery contém a definição da consulta, não os resultados da execução da consulta. Um mecanismo típico para executar uma consulta é um loop For Each. Cada elemento na sequência retornada é acessado pela variável de iteração no loop. Para obter mais informações sobre a execução da consulta, consulte Como gravar sua primeira consulta LINQ.

Para executar a consulta

  1. Adicione o loop For Each abaixo da consulta no projeto.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Coloque o ponteiro do mouse sobre a variável de controle de loop studentRecord para ver seu tipo de dados. O tipo de studentRecord é inferido como sendo Student, porque studentQuery retorna uma coleção de instâncias Student.

  3. Compile e execute o aplicativo pressionando CTRL+F5. Observe os resultados na janela do console.

Modificar a Consulta

É mais fácil examinar os resultados da consulta se eles estiverem em uma ordem especificada. É possível classificar a sequência retornada com base em qualquer campo disponível.

Para ordenar os resultados

  1. Adicione a cláusula Order By a seguir entre a instrução Where e a instrução Select da consulta. A cláusula Order By organizará os resultados em ordem alfabética, de A a Z, de acordo com o sobrenome de cada aluno.

    Order By currentStudent.Last Ascending
    
  2. Para solicitar pelo sobrenome e, em seguida, pelo nome, adicione ambos os campos à consulta:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    Também é possível especificar Descending para ser classificado de Z a A.

  3. Compile e execute o aplicativo pressionando CTRL+F5. Observe os resultados na janela do console.

Para introduzir um identificador local

  1. Adicione o código nesta seção para introduzir um identificador local na expressão de consulta. O identificador local conterá um resultado intermediário. No exemplo a seguir, name é um identificador que contém uma concatenação do nome e sobrenomes do aluno. Um identificador local pode ser usado para conveniência ou pode melhorar o desempenho armazenando os resultados de uma expressão que, de outra forma, seria calculada várias vezes.

    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
    
  2. Compile e execute o aplicativo pressionando CTRL+F5. Observe os resultados na janela do console.

Para projetar um campo na cláusula Select

  1. Adicione a consulta e o loop For Each desta seção para criar uma consulta que produz uma sequência com elementos diferentes dos elementos na origem. No exemplo a seguir, a origem é uma coleção de objetos Student, mas apenas um membro de cada objeto é retornado: o nome dos alunos cujo sobrenome é Garcia. Como currentStudent.First é uma cadeia de caracteres, o tipo de dados da sequência retornada por studentQuery3 é IEnumerable(Of String), uma sequência de cadeias de caracteres. Como nos exemplos anteriores, a determinação da atribuição de um tipo de dados de studentQuery3 deve ser feita pelo compilador usando a inferência de tipo 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
    
  2. Coloque o ponteiro do mouse em studentQuery3 no código para verificar se o tipo atribuído é IEnumerable(Of String).

  3. Compile e execute o aplicativo pressionando CTRL+F5. Observe os resultados na janela do console.

Para criar um tipo anônimo na cláusula Select

  1. Adicione o código desta seção para ver como os tipos anônimos são usados em consultas. Eles são usados em consultas quando você deseja retornar vários campos da fonte de dados em vez de registros completos (registros currentStudent em exemplos anteriores) ou campos únicos (First na seção anterior). Em vez de definir um novo tipo nomeado que contém os campos que você deseja incluir no resultado, especifique os campos na cláusula Select e o compilador cria um tipo anônimo com esses campos como suas propriedades. Para obter mais informações, consulte Tipos Anônimos.

    O exemplo a seguir cria uma consulta que retorna o nome e a classificação de veteranos cuja classificação acadêmica está entre 1 e 10, em ordem de classificação acadêmica. Neste exemplo, o tipo de studentQuery4 deve ser inferido porque a cláusula Select retorna uma instância de um tipo anônimo que não tem nome utilizável.

    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
    
  2. Compile e execute o aplicativo pressionando CTRL+F5. Observe os resultados na janela do console.

Exemplos adicionais

Agora que você entende os conceitos básicos, veja a seguir uma lista de exemplos adicionais para ilustrar a flexibilidade e o poder das consultas LINQ. Cada exemplo é precedido por uma breve descrição do que ele faz. Coloque o ponteiro do mouse sobre a variável de resultado de cada consulta para ver o tipo inferido. Use um loop For Each para produzir os 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

Informações adicionais

Depois que estiver familiarizado com os conceitos básicos de como trabalhar com consultas, você estará pronto para ler a documentação e exemplos para o tipo específico de provedor LINQ que lhe interessam:

Confira também