Ler em inglês

Compartilhar via


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

Executando os exemplos

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

Provedores LINQ

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.

Estrutura de uma consulta LINQ

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).

Operadores de consulta LINQ do 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

Cláusula From (Visual Basic)

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:

Cláusula Select (Visual Basic)

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.

Cláusula Where (Visual Basic)

Opcional. Especifica a condição de filtragem para uma consulta. Por exemplo:

Cláusula Order By (Visual Basic)

Opcional. Especifica a ordem de classificação das colunas em uma consulta. Por exemplo:

Cláusula Join (Visual Basic)

Opcional. Combina duas coleções em uma única coleção. Por exemplo:

Cláusula Group By (Visual Basic)

Opcional. Agrupa os elementos de um resultado de consulta. Pode ser usado para aplicar funções de agregação a cada grupo. Por exemplo:

Cláusula Join Group (Visual Basic)

Opcional. Combina duas coleções em uma única coleção hierárquica. Por exemplo:

Cláusula Aggregate (Visual Basic)

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.

Cláusula Let (Visual Basic)

Opcional. Calcula um valor e o atribui a uma nova variável na consulta. Por exemplo:

Cláusula Distinct (Visual Basic)

Opcional. Restringe os valores da variável de iteração atual para eliminar valores duplicados nos resultados da consulta. Por exemplo:

Cláusula Skip (Visual Basic)

Opcional. Ignora um número especificado de elementos em uma coleção e, em seguida, retorna os elementos restantes. Por exemplo:

Ignorar cláusula While (Visual Basic)

Opcional. Ignora elementos em uma coleção enquanto a condição especificada é true e, em seguida, retorna os elementos restantes. Por exemplo:

Cláusula Take (Visual Basic)

Opcional. Retorna um número especificado de elementos contíguos do início de uma coleção. Por exemplo:

Cláusula Take While (Visual Basic)

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.

Conectando-se a um banco de dados usando LINQ to SQL

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).

Recursos do Visual Basic que suportam LINQ

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.

Execução de consultas adiadas e imediatas

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).

XML no 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.

Recursos relacionados

Tópico

Descrição

XML no Visual Basic

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.

Consultas (Visual Basic)

Fornece informações de referência sobre as cláusulas de consulta que estão disponíveis no Visual Basic.

LINQ (Consulta Integrada à Linguagem)

Inclui informações gerais, orientação de programação e exemplos para LINQ.

LINQ to SQL [wd_LINQSQL]

Inclui informações gerais, orientação de programação e exemplos para LINQ to SQL.

Objetos LINQ to

Inclui informações gerais, orientação de programação e exemplos para LINQ to Objects.

LINQ to ADO.NET (página do portal)

Inclui links para informações gerais, orientação de programação e exemplos para LINQ to ADO.NET.

LINQ to XML

Inclui informações gerais, orientação de programação e exemplos para LINQ to XML.

Tópicos Como Fazer e Passo a Passo

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)

Como atribuir procedimentos armazenados para executar atualizações, inserções e exclusões (Designer Relacional de Objetos)

Capítulos do Livro em Destaque

Chapter 17: LINQ em Programming Visual Basic 2008

Consulte também

Tarefas

Exemplos LINQ

Conceitos

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)

Outros recursos

LINQ (Consulta Integrada à Linguagem)

LINQ to SQL [wd_LINQSQL]

Designer Relacional de Objetos