Compartilhar via


Introdução ao LINQ em Visual Basic

Consultas Integradas à Linguagem (LINQ) adiciona recursos de consulta para ovVisual 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, 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 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 de alta segurança digitada.Esses objetos oferecem suporte IntelliSense, que permite que você escrever código mais rápido e detectar 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 Visual Basic

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

  • Recursos 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 rodar os exemplos na introdução e a estrutura “na seção de uma consulta LINQ”, inclui o código a seguir, que retorna uma lista de clientes e de 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 as consultas Visual Basic LINQ para a fonte de dados que está sendo consultada.Quando você escreve um 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 para os 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.

Provider

Descrição

LINQ para Objects

O provedor LINQ to Objects permite que você consulte coleções e matrizes na memória.Se um objeto oferecer suporte à IEnumerable ou interface IEnumerable<T>, o provedor LINQ to Objects permite a você consultá-lo.

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 LINQ to Objects.

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 a trabalhar com LINQ to SQL, incluindo um Object Relational Designer (O/R Designer).Este criador é usado para criar um modelo de objeto em um aplicativo que mapeia para objetos em um banco de dados. O criador O/R 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 Objects, consulte LINQ to SQL.Para obter mais informações sobre o Object Relational Designer, consulte Object Relational Designer (O/R Designer).

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 e salvar XML para um arquivo.

Além disso, o provedor LINQ to XML permite literais XML e propriedades de eixo XML que permitem escrever XML diretamente em seu código Visual Basic.Para obter mais informações, consulte XML no Visual Basic.

LINQ para DataSet

O provedor LINQ to DataSet permite consultar e atualizar dados em um DataSet 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

Um consulta LINQ, geralmente conhecida como uma expressão de consulta,consiste 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 a sintaxe do 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 na 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, ainda nesse tópico.Por exemplo, a consulta a seguir identifica um conjunto 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 inclue 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 a partir de 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 de coleção retornada é 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 retornada é 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 um 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 daquele 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 inclue 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 como cláusulas de consulta Visual Basic , consulte Consultas (Visual Basic).

Operadores de consulta LINQ Visual Basic

As classes no namespace de System.Linq e outros namespaces que suportam 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 descrito pela tabela a seguir.

Termo

Definição

(Visual Basic) da cláusula FROM

Ou uma cláusula From ou uma cláusula 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:

Selecione a cláusula (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 para a consulta consistem as variáveis de iteração especificadas por From ou cláusula Aggregate .

Onde a cláusula (Visual Basic)

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

Ordem por cláusula (Visual Basic)

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

(Visual Basic) da cláusula de associação

Opcional.Combina duas coleções numa única.Por exemplo:

Agrupar por cláusula (Visual Basic)

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

Cláusula de associação de grupo (Visual Basic)

Opcional.Combina duas coleções numa única coleção hierarquizada.Por exemplo:

Cláusula Aggregate (Visual Basic)

Ou uma cláusula From ou uma cláusula Aggregate é necessária para iniciar uma consulta.Uma cláusula Aggregate aplica uma ou mais funções agregadas 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.

Permitir que a cláusula (Visual Basic)

Opcional.Calcula um valor e a 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 de ignorar (Visual Basic)

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

Ignorar durante a cláusula (Visual Basic)

Opcional.Ignora elementos numa coleção enquanto a condição especificada é true e então retorna os elementos restantes.Por exemplo:

Levar a cláusula (Visual Basic)

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

Se enquanto cláusula (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 como 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 para combinar os resultados das duas consultas em um resultado da consulta.Ele usa o método ToList<TSource> 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 LINQ adicionais, consulte Visão geral operadores de consulta padrão.

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

Na 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, você pode adicionar um modelo de item Classes LINQ to SQL ao seu projeto.Isso exibirá o Object Relational Designer (O/R Designer).O O/R Designer 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 O/R Designer.O objeto DataContext para seu projeto é nomeado com base no nome do seu arquivo LINQ to SQL.Por exemplo, um arquivo LINQ to SQL Northwind.dbml é chamado criará um objeto DataContext chamado NorthwindDataContext.

Para obter exemplos com instruções passo a passo, consulte Como: consulta um banco de dados usando LINQ (Visual Basic) e Como: chamar um procedimento armazenado usando LINQ (Visual Basic).

Recursos 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 executar 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 que 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 próprio.

Para obter detalhes, consulte:Visual Basic os recursos que oferecem suporte ao 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 ele é 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 é executada.Esse processo é conhecido como execução adiada .

As consultas também podem ser executadas quando eles são definidos, 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, incluindo Sum, Average, Min, ou Max.Para obter mais informações sobre funções agregadas, 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 estes métodos, consulte Convertendo tipos de dados.

Para obter mais informações sobre a execução da consulta, consulte Gravando a primeira consulta LINQ (Visual Basic).

XML no Visual Basic

Funcionalidades 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 suas sub-elementos 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

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

LINQ to Objects

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

LINQ para ADO.NET (página de Portal)

Inclui links para informações gerais, orientação de programação, e os exemplos para LINQ te o 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: consulta 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 com LINQ usando associações (Visual Basic)

Como: classificar os resultados da consulta usando LINQ (Visual Basic)

Como: filtrar os resultados da consulta usando LINQ (Visual Basic)

Como: Contar, soma ou média de dados usando LINQ (Visual Basic)

Como: localizar o valor mínimo ou valor de máximo em um resultado de consulta usando LINQ (Visual Basic)

Walkthrough: Creating LINQ to SQL Classes (O/R Designer)

How to: Assign Stored Procedures to Perform Updates, Inserts, and Deletes (O/R Designer)

Capítulos caracterizados de livro

Chapter 17: LINQ Em Programming Visual Basic 2008

Consulte também

Tarefas

Amostras do LINQ

Conceitos

Visão geral do LINQ to XML em Visual Basic

LINQ to DataSet Overview

DataContext Methods (O/R Designer)

Outros recursos

LINQ (consulta integrada à linguagem)

LINQ to SQL

Object Relational Designer (O/R Designer)