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
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, customers
e 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ô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
-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 alondonCusts5
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 By
o , consulte Agrupar por cláusula.