Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tutorial demonstra como você pode usar recursos de linguagem do Visual Basic para escrever expressões de consulta LINQ Language-Integrated. O passo a passo demonstra como criar consultas em uma lista de objetos Student, como executar as consultas e como modificá-las. As consultas incorporam vários recursos, incluindo inicializadores de objeto, inferência de tipo local e tipos anônimos.
Depois de concluir este passo a passo, você estará pronto para passar para os exemplos e 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
Inicie o Visual Studio.
No menu Arquivo , aponte para Novoe clique em Projeto.
Na lista Modelos Instalados , clique em Visual Basic.
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 System.Linq namespace.
Na Página de Compilação, Designer de Projeto (Visual Basic), verifique se a Opção Inferir está Ativada.
Adicionar uma fonte de dados In-Memory
A fonte de dados para as consultas neste passo a passo é uma lista de Student
objetos. Cada Student
objeto 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
Student
classe e crie uma lista de instâncias da classe.Importante
O código necessário para definir a
Student
classe e criar a lista usada nos exemplos passo a passo é fornecido em How to: Create a List of Items. Você pode copiá-lo de lá e colá-lo em seu projeto. O novo código substitui o código que apareceu quando você criou o projeto.
Para adicionar um novo aluno à lista de alunos
- Siga o padrão no
getStudents
método para adicionar outra instância daStudent
classe à lista. A adição do aluno apresentará você aos inicializadores de objeto. Para obter mais informações, consulte Inicializadores de Objeto: Tipos Nomeados e Anônimos.
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 seleciona o objeto completo Student
cada vez, o tipo do resultado da consulta é IEnumerable(Of Student)
. No entanto, o tipo da consulta normalmente não é especificado nas definições de consulta. Em vez disso, o compilador usa inferência de tipo local para determinar o tipo. Para obter mais informações, consulte Inferência de Tipo 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
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.
Dim studentQuery = From currentStudent In students Where currentStudent.Rank <= 10 Select currentStudent
Posicione o ponteiro do mouse sobre
studentQuery
no seu código para verificar se o tipo atribuído pelo 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 For Each
loop. Cada elemento na sequência retornada é acessado por meio da variável de iteração de loop. Para obter mais informações sobre a execução da consulta, consulte Como escrever sua primeira consulta LINQ.
Para executar a consulta
Adicione o loop a seguir
For Each
abaixo da consulta em seu projeto.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) Next
Coloque o ponteiro do mouse sobre a variável de controle de loop
studentRecord
para ver seu tipo de dados. O tipo destudentRecord
é inferido para serStudent
, porquestudentQuery
retorna uma coleção deStudent
instâncias.Compile e execute o aplicativo pressionando CTRL+F5. Observe os resultados na janela do console.
Modificar a consulta
É mais fácil verificar os resultados da consulta se eles estiverem em uma ordem especificada. Você pode classificar a sequência retornada com base em qualquer campo disponível.
Para ordenar os resultados
Adicione a seguinte cláusula
Order By
entre a instruçãoWhere
e a instruçãoSelect
na consulta. AOrder By
cláusula ordenará os resultados em ordem alfabética de A a Z, de acordo com o sobrenome de cada aluno.Order By currentStudent.Last Ascending
Para solicitar por sobrenome e, em seguida, primeiro nome, adicione ambos os campos à consulta:
Order By currentStudent.Last Ascending, currentStudent.First Ascending
Você também pode especificar
Descending
a ordem de Z para A.Compile e execute o aplicativo pressionando CTRL+F5. Observe os resultados na janela do console.
Para introduzir um identificador local
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 dos primeiros 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
Compile e execute o aplicativo pressionando CTRL+F5. Observe os resultados na janela do console.
Para projetar um campo na cláusula Select
Adicione a consulta e o loop
For Each
desta seção para criar uma consulta que produza uma sequência cujos elementos sejam diferentes dos elementos da origem. No exemplo a seguir, a origem é uma coleção deStudent
objetos, mas apenas um membro de cada objeto é retornado: o nome dos alunos cujo sobrenome é Garcia. ComocurrentStudent.First
é uma cadeia de caracteres, o tipo de dados da sequência retornada éstudentQuery3
IEnumerable(Of String)
uma sequência de cadeias de caracteres. Como nos exemplos anteriores, a atribuição de um tipo de dados parastudentQuery3
é deixada para o compilador determinar usando 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
Passe o ponteiro do mouse sobre
studentQuery3
em seu código para verificar se o tipo atribuído éIEnumerable(Of String)
.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
Adicione o código desta seção para ver como os tipos anônimos são usados em consultas. Você os usa em consultas quando deseja retornar vários campos da fonte de dados em vez de registros completos (
currentStudent
registros em exemplos anteriores) ou campos únicos (First
na seção anterior). Em vez de definir um novo tipo nomeado que contenha os campos que você deseja incluir no resultado, especifique os campos naSelect
cláusula 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 idosos 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 aSelect
cláusula retorna uma instância de um tipo anônimo e um tipo anônimo não tem nenhum 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
Compile e execute o aplicativo pressionando CTRL+F5. Observe os resultados na janela do console.
Exemplos adicionais
Agora que você entende as noções básicas, 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 da consulta para cada consulta para ver o tipo inferido. Use um For Each
loop 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 de conhecer os conceitos básicos de trabalhar com consultas, você estará pronto para ler a documentação e os exemplos para o tipo específico de provedor LINQ no qual você está interessado: