Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 seguintes tópicos:
Introdução ao LINQ no Visual Basic
Passo a passo: Escrevendo consultas no Visual Basic
Especificando a fonte de dados (De origem)
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 cláusula From no Visual Basic, consulte From Clause.
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.
Ordenação de Dados (Ordenar 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
Selectcampos 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
londonCusts4sã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
Selectclá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 delondonCusts5no seguinte exemplo é IEnumerable de NamePhone.Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End ClassDim 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.
União de Dados (Junção e Junção de 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
Observação
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: Caloiro
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, consulte Cláusula GROUP BY.