Introdução a LINQ no Visual Basic
LINQ (Consulta Integrada à Linguagem) adiciona recursos de consulta para o Visual Basic e fornece recursos simples e eficientes quando você trabalha com todos os tipos de dados. Em vez enviar uma consulta para um banco de dados para ser processada, ou trabalhar com diferentes sintaxes de consulta para cada tipo de dados que você está procurando, o LINQ apresenta consultas como parte da linguagem Visual Basic. Ela usa uma sintaxe unificada independentemente do tipo de dados.
LINQ permite consultar dados de um banco de dados SQL Server, XML, matrizes de memória e coleções, conjuntos de dados do ADO.NET ou qualquer outro local ou remoto fonte de dados que ofereça suporte ao LINQ. Você pode fazer tudo isso com elementos de linguagem Visual Basic comuns. Como as consultas são gravadas na linguagem Visual Basic, resultados da consulta são retornados como objetos fortemente tipados. Esses objetos oferecem suporte ao IntelliSense, que permite que você escreva código mais rápido e detecte erros nas consultas no tempo de compilação, em vez de em tempo de execução. Consultas LINQ podem ser usadas como a fonte de consultas adicionais para refinar os resultados. Elas também podem ser associadas a controles, assim os usuários podem facilmente exibir e modificar os resultados de consulta.
Por exemplo, o exemplo de código a seguir mostra uma consulta LINQ que retorna uma lista de clientes de uma coleção e os agrupa com base em sua localização.
' Obtain a list of customers.
Dim customers As List(Of Customer) = GetCustomers()
' Return customers that are grouped based on country.
Dim countries = From cust In customers
Order By cust.Country, cust.City
Group By CountryName = cust.Country
Into CustomersInCountry = Group, Count()
Order By CountryName
' Output the results.
For Each country In countries
Debug.WriteLine(country.CountryName & " count=" & country.Count)
For Each customer In country.CustomersInCountry
Debug.WriteLine(" " & customer.CompanyName & " " & customer.City)
Next
Next
' Output:
' Canada count=2
' Contoso, Ltd Halifax
' Fabrikam, Inc. Vancouver
' United States count=1
' Margie's Travel Redmond
Neste tópico, você encontrará informações sobre as seguintes áreas:
Executando os exemplos
Provedores LINQ
Estrutura de uma consulta LINQ
Operadores de consulta LINQ do Visual Basic
Conectando-se a um banco de dados usando LINQ to SQL
Recursos do Visual Basic que suportam LINQ
Execução de consultas adiadas e imediatas
XML no Visual Basic
Recursos relacionados
Tópicos Como Fazer e Passo a Passo
Para executar os exemplos na introdução e na seção “Estrutura de uma consulta LINQ”, inclua o código a seguir, que retorna uma lista de clientes e pedidos.
' Return a list of customers.
Private Function GetCustomers() As List(Of Customer)
Return New List(Of Customer) From
{
New Customer With {.CustomerID = 1, .CompanyName = "Contoso, Ltd", .City = "Halifax", .Country = "Canada"},
New Customer With {.CustomerID = 2, .CompanyName = "Margie's Travel", .City = "Redmond", .Country = "United States"},
New Customer With {.CustomerID = 3, .CompanyName = "Fabrikam, Inc.", .City = "Vancouver", .Country = "Canada"}
}
End Function
' Return a list of orders.
Private Function GetOrders() As List(Of Order)
Return New List(Of Order) From
{
New Order With {.CustomerID = 1, .Amount = "200.00"},
New Order With {.CustomerID = 3, .Amount = "600.00"},
New Order With {.CustomerID = 1, .Amount = "300.00"},
New Order With {.CustomerID = 2, .Amount = "100.00"},
New Order With {.CustomerID = 3, .Amount = "800.00"}
}
End Function
' Customer Class.
Private Class Customer
Public Property CustomerID As Integer
Public Property CompanyName As String
Public Property City As String
Public Property Country As String
End Class
' Order Class.
Private Class Order
Public Property CustomerID As Integer
Public Property Amount As Decimal
End Class
Um provedor LINQ mapeia suas consultas LINQ Visual Basic para a fonte de dados que está sendo consultada. Quando você escreve uma consulta LINQ, o provedor leva essa consulta e converte em comandos que a fonte de dados poderá executar. O provedor também converte dados da fonte nos objetos que compõem o resultado da consulta. Finalmente, ele converte objetos em dados quando você envia atualizações para a fonte de dados.
Visual Basic inclui os seguintes provedores LINQ.
Provedor |
Descrição |
LINQ to Objects |
O provedor LINQ to Objects permite que você consulte coleções e matrizes na memória. Se um objeto oferecer suporte à interface de IEnumerable ou de IEnumerable, o provedor LINQ to Objects permite que você o consulte. Você pode ativar o provedor LINQ to Objects importando o namespace System.Linq , que é importado, por padrão, para todos os projetos Visual Basic. Para obter mais informações sobre o provedor LINQ to Objects, consulte Objetos LINQ to. |
LINQ para SQL |
O provedor LINQ to SQL permite consultar e modificar dados em um banco de dados SQL Server. Isso facilita mapear a modelo de objeto de um aplicativo para as tabelas e objetos em um banco de dados. Visual Basic facilita o trabalho com o LINQ to SQL, incluindo o Object Relational Designer (Designer Relacional de Objetos). Este designer é usado para criar um modelo de objeto em um aplicativo que mapeia para objetos em um banco de dados. O Designer Relacional de Objetos também fornece funcionalidade para mapear os procedimentos armazenados e funções para o objeto DataContext,que gerencia a comunicação com o banco de dados e armazena o estado para concorrência otimista verificações. Para obter mais informações sobre o provedor LINQ to SQL, consulte LINQ to SQL [wd_LINQSQL]. Para obter mais informações sobre o Object Relational Designer, consulte Designer Relacional de Objetos. |
LINQ para XML |
O provedor LINQ to XML permite consultar e modificar XML. Você pode modificar XML em memória, ou você pode carregar XML de um arquivo e salvar XML nele. Além disso, o provedor LINQ to XML permite literais XML e propriedades de eixo XML que permitem gravar o XML diretamente em seu código Visual Basic. Para obter mais informações, consulte XML no Visual Basic. |
LINQ to DataSet |
O provedor LINQ to DataSet permite consultar e atualizar dados em um conjunto de dados ADO.NET. Você pode adicionar o poder do LINQ para aplicativos que usam conjuntos de dados para simplificar e estender seus recursos para consultar, agregar e atualizar os dados no seu conjunto de dados. Para obter mais informações, consulte LINQ to DataSet. |
Uma consulta LINQ, geralmente conhecida como uma expressão de consulta, consiste em uma combinação de cláusulas de consulta que identificam as fontes de dados e variáveis de iteração para a consulta. Uma expressão de consulta também pode incluir instruções para classificação, filtragem, agrupamento e associação ou cálculos para aplicar a dados de origem. A sintaxe de expressões de consulta é semelhante à sintaxe de SQL; portanto, você pode achar grande parte da sintaxe familiar.
Uma expressão de consulta começa com uma cláusula From. Essa cláusula identifica o dados de origem para uma consulta e as variáveis que são usadas para se referir a cada elemento do dados de origem individualmente. Essas variáveis são denominadas variáveis de intervalo ou variáveis de iteração. A cláusula From é necessária para uma consulta, exceto para consultas Aggregate, onde a cláusula From é opcional. Depois que o escopo e a fonte da consulta são identificados nas cláusulas From ou Aggregate, você pode incluir qualquer combinação de cláusulas de consulta para refinar a consulta. Para obter detalhes sobre cláusulas de consulta, consulte Operadores de consulta LINQ Visual Basic mais adiante neste tópico. Por exemplo, a consulta a seguir identifica uma coleção de origem de dados do cliente como a variável customers e uma variável de iteração chamada cust.
Dim customers = GetCustomers()
Dim queryResults = From cust In customers
For Each result In queryResults
Debug.WriteLine(result.CompanyName & " " & result.Country)
Next
' Output:
' Contoso, Ltd Canada
' Margie's Travel United States
' Fabrikam, Inc. Canada
Esse exemplo é uma consulta válida por si só; no entanto, a consulta passará a ser muito mais poderosa quando você adicionar mais cláusulas de consulta para refinar os resultados. Por exemplo, você pode adicionar uma cláusula Where para filtrar o resultado por um ou mais valores. Expressões de consulta são uma única linha de código; você apenas pode acrescentar cláusulas de consulta adicionais ao final da consulta. Você pode dividir uma consulta ao longo de várias linhas de texto para aumentar legibilidade usando o caractere de continuação de linha sublinhado (_). O exemplo de código a seguir mostra um exemplo de uma consulta que inclui uma cláusula Where.
Dim queryResults = From cust In customers
Where cust.Country = "Canada"
Outra cláusula de consulta poderosa é a cláusula Select, que permite retornar somente os campos selecionados da fonte de dados. Consultas LINQ retornam coleções enumeráveis de objetos fortemente tipados. Uma consulta pode retornar uma coleção de tipos anônimos ou tipos nomeados. Você pode usar a cláusula Select para retornar apenas um único campo a partir de fonte de dados. Quando você fizer isso, o tipo da coleção retornado será o tipo daquele campo único. Você também pode usar a cláusula Select para retornar vários campos a partir de fonte de dados. Quando você fizer isso, o tipo de coleção retornado será um novo tipo anônimo. Você pode também fazer a correspondência entre os campos retornados pela consulta para os campos de um tipo nomeado especificado. O exemplo de código a seguir mostra uma expressão de consulta que retorna uma coleção de tipos anônimos que possuem membros preenchidos com dados dos campos selecionados a partir de fonte de dados.
Dim queryResults = From cust In customers
Where cust.Country = "Canada"
Select cust.CompanyName, cust.Country
Consultas LINQ também podem ser usadas para combinar várias fontes de dados e retornar um único resultado. Isso pode ser feito com uma ou mais cláusulas From, ou usando as cláusulas de consulta Join ou Group Join. O exemplo de código a seguir mostra uma expressão de consulta que combina dados de cliente e pedido e retorna uma coleção de tipos anônimas contendo dados do cliente e de pedidos.
Dim customers = GetCustomers()
Dim orders = GetOrders()
Dim queryResults = From cust In customers, ord In orders
Where cust.CustomerID = ord.CustomerID
Select cust, ord
For Each result In queryResults
Debug.WriteLine(result.ord.Amount & " " & result.ord.CustomerID & " " & result.cust.CompanyName)
Next
' Output:
' 200.00 1 Contoso, Ltd
' 300.00 1 Contoso, Ltd
' 100.00 2 Margie's Travel
' 600.00 3 Fabrikam, Inc.
' 800.00 3 Fabrikam, Inc.
Você pode usar a cláusula Group Join para criar um resultado de consulta hierárquico que contém uma coleção de objetos do cliente. Cada objeto do cliente tem uma propriedade que contém uma coleção de todos os pedidos desse cliente. O exemplo de código a seguir mostra uma expressão de consulta que combina dados de cliente e de pedido e retorna uma coleção de tipos anônimas contendo dados do cliente e de pedidos. A consulta retorna um tipo que inclui uma propriedade CustomerOrders que contém uma coleção de dados de pedidos para o cliente. Ele também inclui uma propriedade OrderTotal que contém a soma dos totais para todos os de pedidos daquele cliente. (Esta consulta é equivalente a uma LEFT OUTER JOIN.)
Dim customers = GetCustomers()
Dim orders = GetOrders()
Dim queryResults = From cust In customers
Group Join ord In orders On
cust.CustomerID Equals ord.CustomerID
Into CustomerOrders = Group,
OrderTotal = Sum(ord.Amount)
Select cust.CompanyName, cust.CustomerID,
CustomerOrders, OrderTotal
For Each result In queryResults
Debug.WriteLine(result.OrderTotal & " " & result.CustomerID & " " & result.CompanyName)
For Each ordResult In result.CustomerOrders
Debug.WriteLine(" " & ordResult.Amount)
Next
Next
' Output:
' 500.00 1 Contoso, Ltd
' 200.00
' 300.00
' 100.00 2 Margie's Travel
' 100.00
' 1400.00 3 Fabrikam, Inc.
' 600.00
' 800.00
Há vários outros operadores de consulta LINQ que você pode usar para criar expressões de consulta eficiente. A próxima seção deste tópico discute as várias cláusulas de consulta que você pode incluir em uma expressão de consulta. Para obter detalhes sobre cláusulas de consulta Visual Basic, consulte Consultas (Visual Basic).
As classes no namespace System.Linq e em outros namespaces que dão suporte a consultas LINQ incluem métodos que você pode chamar para criar e refinar consultas com base nas necessidades do seu aplicativo. Visual Basic inclui palavras-chave para a maioria das cláusulas de consulta comuns, como descritas pela tabela a seguir.
Termo |
Definição |
Uma cláusula From ou Aggregate é necessária para iniciar uma consulta. Uma cláusula From especifica uma coleção de fonte e uma variável de iteração para uma consulta. Por exemplo: |
|
Opcional. Declara um conjunto de variáveis de iteração para uma consulta. Por exemplo:
Se uma cláusula Select não for especificada, as variáveis de iteração da consulta consistirão nas variáveis de iteração especificadas pela cláusula From ou Aggregate. |
|
Opcional. Especifica a condição de filtragem para uma consulta. Por exemplo: |
|
Opcional. Especifica a ordem de classificação das colunas em uma consulta. Por exemplo: |
|
Opcional. Combina duas coleções em uma única coleção. Por exemplo:
|
|
Opcional. Agrupa os elementos de um resultado de consulta. Pode ser usado para aplicar funções de agregação a cada grupo. Por exemplo: |
|
Opcional. Combina duas coleções em uma única coleção hierárquica. Por exemplo:
|
|
Uma cláusula From ou Aggregate é necessária para iniciar uma consulta. Uma cláusula Aggregate aplica uma ou mais funções de agregação a uma coleção. Por exemplo, você pode usar a cláusula Aggregate para calcular uma soma de todos os elementos retornados por uma consulta.
Você também pode usar a cláusula Aggregate para modificar uma consulta. Por exemplo, você pode usar a cláusula Aggregate para executar um cálculo em uma coleção relacionada de consulta. |
|
Opcional. Calcula um valor e o atribui a uma nova variável na consulta. Por exemplo: |
|
Opcional. Restringe os valores da variável de iteração atual para eliminar valores duplicados nos resultados da consulta. Por exemplo: |
|
Opcional. Ignora um número especificado de elementos em uma coleção e, em seguida, retorna os elementos restantes. Por exemplo: |
|
Opcional. Ignora elementos em uma coleção enquanto a condição especificada é true e, em seguida, retorna os elementos restantes. Por exemplo: |
|
Opcional. Retorna um número especificado de elementos contíguos do início de uma coleção. Por exemplo: |
|
Opcional. Ignora elementos numa coleção desde que uma condição especificada seja true e então retorna os elementos restantes. Por exemplo: |
Para obter detalhes sobre cláusulas de consulta Visual Basic, consulte Consultas (Visual Basic).
Você pode usar recursos adicionais de consulta LINQ chamando membros dos tipos enumeráveis e consultáveis fornecidos pelo LINQ. Você pode usar esses recursos adicionais, chamando um operador de consulta específica no resultado de uma expressão de consulta. Por exemplo, o exemplo de código a seguir usa o método Union``1 para combinar os resultados de duas consultas em um resultado da consulta. Ele usa o método ToList``1 para retornar o resultado da consulta como uma lista genérica.
Public Function GetAllCustomers() As List(Of Customer)
Dim customers1 = From cust In domesticCustomers
Dim customers2 = From cust In internationalCustomers
Dim customerList = customers1.Union(customers2)
Return customerList.ToList()
End Function
Para obter detalhes sobre recursos adicionais do LINQ, consulte Visão geral de operadores de consulta padrão.
No Visual Basic, identifique os objetos de banco de dados SQL Server, como tabelas, visões e procedimentos armazenados, que você deseja acessar, usando um arquivo LINQ to SQL. Um arquivo LINQ to SQL possui uma extensão .dbml.
Quando você tiver uma conexão válida para um banco de dados SQL Server, poderá adicionar um modelo de item Classes LINQ to SQL ao seu projeto. Isso exibirá o Object Relational Designer. O Designer Relacional de Objetos permite que você arraste os itens que você deseja acessar no código do Gerenciador de Servidores/Gerenciador do Banco de Dados para a superfície do designer. O arquivo LINQ to SQL adiciona um objeto DataContext ao seu projeto. Este objeto inclui propriedades e coleções para as tabelas e modos de exibição que você deseja acesso, e os métodos para os procedimentos armazenados que você deseja chamar. Depois de salvar as alterações para o arquivo LINQ to SQL (.dbml), você pode acessar esses objetos no seu código referenciando o objeto DataContext que é definido pelo Designer Relacional de Objetos O objeto DataContext para seu projeto é nomeado com base no nome do seu arquivo LINQ to SQL. Por exemplo, um arquivo LINQ to SQL denominado Northwind.dbml criará um objeto DataContext denominado NorthwindDataContext.
Para obter exemplos com instruções passo a passo, consulte Como consultar um banco de dados usando LINQ (Visual Basic) e Como chamar um procedimento armazenado usando LINQ (Visual Basic).
Visual Basic inclui outros recursos notáveis que tornam o uso de LINQ simples e reduzem a quantidade de código que você deve escrever para realizar consultas LINQ. Eles incluem o seguinte:
Tipos anônimos, que permitem criar um novo tipo com base no resultado de consulta.
Variáveis de tipo implícito, que permitem adiar a especificação de um tipo e deixar o compilador inferir o tipo com base no resultado da consulta.
Métodos de extensão, que permitem estender um tipo existente com seus próprios métodos sem modificar o tipo em si.
Para obter detalhes, consulte Recursos do Visual Basic que suportam LINQ.
A execução da consulta é separada da criação de uma consulta. Depois que uma consulta é criada, sua execução é disparada por um mecanismo separado. Uma consulta pode ser executada assim que ela é definida (execução imediata), ou a definição pode ser armazenada e a consulta pode ser executada posteriormente (execução adiada).
Por padrão, quando você cria uma consulta, ela não é executada imediatamente. Em vez disso, o definição de consulta é armazenada na variável que é usada para fazer referência ao resultado da consulta. Quando a variável de resultados de consulta for acessada mais tarde no código, como em um loop For…Next, a consulta será executada. Esse processo é conhecido como execução adiada.
As consultas também podem ser executadas quando são definidas, que é conhecido como execução imediata. Você pode acionar a execução imediata, aplicando um método que exige acesso aos elementos individuais do resultado da consulta. Isso pode ser o resultado de uma função agregada, como Count, Sum, Average, Min ou Max. Para obter mais informações sobre funções de agregação, consulte Cláusula Aggregate (Visual Basic).
Usar os métodos ToList ou ToArray também forçará a execução imediata. Isso pode ser útil quando você deseja executar a consulta imediatamente e armazenar em cache os resultados. Para obter mais informações sobre esses métodos, consulte Convertendo tipos de dados.
Para obter mais informações sobre execução de consulta, consulte Escrevendo a primeira consulta LINQ (Visual Basic).
Os recursos XML no Visual Basic incluem literais XML e propriedades de eixo XML, que permitem facilmente criar, acessar, consultar e modificar XML no seu código. Literais XML permitem escrever XML diretamente em seu código. O compilador Visual Basic trata o XML como um objeto de dados de primeira classe.
O exemplo de código a seguir mostra como criar um elemento XML, acessar seus subelementos e atributos e consultar o conteúdo do elemento usando LINQ.
' Place Imports statements at the top of your program.
Imports <xmlns:ns="http://SomeNamespace">
Module Sample1
Sub SampleTransform()
' Create test by using a global XML namespace prefix.
Dim contact =
<ns:contact>
<ns:name>Patrick Hines</ns:name>
<ns:phone ns:type="home">206-555-0144</ns:phone>
<ns:phone ns:type="work">425-555-0145</ns:phone>
</ns:contact>
Dim phoneTypes =
<phoneTypes>
<%= From phone In contact.<ns:phone>
Select <type><%= phone.@ns:type %></type>
%>
</phoneTypes>
Console.WriteLine(phoneTypes)
End Sub
End Module
Para obter mais informações, consulte XML no Visual Basic.
Tópico |
Descrição |
Descreve os recursos XML no Visual Basic que podem ser consultados e que permitem incluir XML como objetos de dados de primeira classe no seu código Visual Basic. |
|
Fornece informações de referência sobre as cláusulas de consulta que estão disponíveis no Visual Basic. |
|
Inclui informações gerais, orientação de programação e exemplos para LINQ. |
|
Inclui informações gerais, orientação de programação e exemplos para LINQ to SQL. |
|
Inclui informações gerais, orientação de programação e exemplos para LINQ to Objects. |
|
Inclui links para informações gerais, orientação de programação e exemplos para LINQ to ADO.NET. |
|
Inclui informações gerais, orientação de programação e exemplos para LINQ to XML. |
Como consultar um banco de dados usando LINQ (Visual Basic)
Como chamar um procedimento armazenado usando LINQ (Visual Basic)
Como modificar dados em um banco de dados usando LINQ (Visual Basic)
Como combinar dados a LINQ com junções (Visual Basic)
Como classificar resultados de consulta usando LINQ (Visual Basic)
Como filtrar resultados de consulta usando LINQ (Visual Basic)
Como contar, somar ou fazer média de dados usando LINQ (Visual Basic)
Como localizar o valor mínimo ou máximo em um resultado de consulta usando LINQ (Visual Basic)
Passo a passo: criando classes LINQ to SQL (Designer Relacional de Objetos)
Chapter 17: LINQ em Programming Visual Basic 2008
Visão geral de LINQ to XML no Visual Basic
LINQ para visão geral do DataSet
Métodos de DataContext (Designer de Objeto Relacional)