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
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ônimoDim 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 delondonCusts5
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.