Gravando a primeira consulta LINQ (Visual Basic)

A consulta é uma expressão que recupera dados de uma fonte de dados. Consultas são expressos em uma linguagem de consulta dedicado. Ao longo do tempo, idiomas diferentes foram desenvolvidos para diferentes tipos de fontes de dados, por exemplo, SQL para bancos de dados relacionais e XQuery para XML. Isso torna necessário para o desenvolvedor do aplicativo aprender uma nova linguagem de consulta para cada tipo de fonte de dados ou o formato de dados que é suportado.

LINQ (consulta integrada à linguagem)simplifica a situação, oferecendo um modelo consistente para trabalhar com dados em vários tipos de fontes de dados e formatos. Em um LINQ a consulta, você está sempre trabalhando com objetos. Você pode usar os mesmos padrões de codificação básicos para consultar e transformar dados em documentos XML, bancos de dados SQL, ADO.NET datasets e entidades.Coleções do NET Framework e qualquer outra fonte ou formato para o qual um LINQ o provedor está disponível. Este documento descreve as três fases de criação e uso do basic LINQ consultas.

link para vídeo Para a demonstração de vídeo relacionada, consulte Fazer como i: Começar com o LINQ?.

Três estágios de uma operação de consulta

LINQoperações de consulta consistem em três ações:

  1. Obter a fonte de dados ou fontes.

  2. Crie a consulta.

  3. Execute a consulta.

Em LINQ, a execução de uma consulta é diferente da criação da consulta. Você não recuperar os dados apenas criando uma consulta. Esse ponto é discutido em mais detalhes posteriormente neste tópico.

O exemplo a seguir ilustra as três partes de uma operação de consulta. O exemplo usa uma matriz de inteiros como uma fonte de dados conveniente para fins de demonstração. No entanto, os mesmos conceitos também se aplicam a outras fontes de dados.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

Saída:

0 2 4 6

A fonte de dados

Como a fonte de dados no exemplo anterior é uma matriz, implicitamente suporta genérico IEnumerable<T> interface. É esse fato que permite que você use uma matriz como uma fonte de dados para um LINQ de consulta. Tipos que oferecem suporte a uma interface derivada como, por exemplo, a classe genérica ou IEnumerable (Of T) IQueryable<T>, são chamados de tipos consultáveis.

Como um tipo de implicitamente queryable requer matriz sem modificação ou tratamento especial para servir como um LINQ dados de origem. O mesmo é verdadeiro para qualquer tipo de coleção que ofereça suporte a IEnumerable (Of T), incluindo o genérico List<T>, Dictionary<TKey, TValue>e outras classes do.NET Framework class library.

Se os dados de origem já não implementam IEnumerable (Of T), um LINQ provedor é necessária para implementar a funcionalidade da operadores de consulta padrão fonte de dados. Por exemplo, LINQ to XML manipula o trabalho de carregar um documento XML em um queryable XElement Digite, conforme mostrado no exemplo a seguir. Para obter mais informações sobre os operadores de consulta padrão, consulte Visão geral operadores de consulta padrão.

' Create a data source from an XML document.
Dim contacts = XElement.Load("c:\myContactList.xml")

Com LINQ to SQL, primeiro crie um mapeamento relacional do objeto em tempo de design, manualmente ou usando o Object Relational Designer (O/R Designer). Você escrever suas consultas em relação os objetos e, em tempo de execução LINQ to SQL cuida da comunicação com o banco de dados. No exemplo a seguir, customers representa uma tabela específica no banco de dados, e Table<TEntity> suporta genérico IQueryable<T>.

' Create a data source from a SQL table.
Dim db As New DataContext("C:\Northwind\Northwnd.mdf")
Dim customers As Table(Of Customer) = db.GetTable(Of Customer)

Para obter mais informações sobre como criar tipos específicos de fontes de dados, consulte a documentação para as várias LINQ provedores. (Para obter uma lista desses provedores, consulte LINQ (consulta integrada à linguagem).) A regra básica é simple: um LINQ fonte de dados é qualquer objeto que ofereça suporte genérico IEnumerable<T> interface, ou uma interface que herda do proprietário.

ObservaçãoObservação

Tipos como ArrayList que ofereçam suporte a não genérica IEnumerable interface também pode ser usado como LINQ fontes de dados. Para obter um exemplo que usa um ArrayList, consulte Como: Consultar um ArrayList com LINQ.

A consulta.

Na consulta, você pode especificar quais informações você deseja recuperar da fonte de dados ou fontes. Você também tem a opção de especificar como os que informações devem ser classificadas, agrupadas ou estruturadas antes que ele é retornado. Para habilitar a criação da consulta, Visual Basic incorporou nova sintaxe de consulta para o idioma.

Quando é executado, a consulta no exemplo a seguir retorna os números de todos os pares de uma matriz de inteiros, numbers.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

A expressão de consulta contém três cláusulas: From, Where, and Select. A função específica e a finalidade de cada cláusula de expressão de consulta é discutida Operações básicas de consulta (Visual Basic). Para obter mais informações, consulte Consultas(Visual Basic). Observe que no LINQ, uma definição de consulta geralmente é armazenada em uma variável e executada posteriormente. A consulta variável, como evensQuery no exemplo anterior, deve ser um tipo que podem ser consultado. O tipo de evensQuery é IEnumerable(Of Integer), atribuído pelo compilador usando inferência de tipo local.

É importante lembrar que a variável de consulta não faz nada e não retornará nenhum dado. Ele apenas armazena a definição da consulta. No exemplo anterior, é o For Each loop que executa a consulta.

Execução da consulta

Execução da consulta é separada da criação da consulta. Criação de consulta define a consulta, mas a execução é disparada por um mecanismo diferente. 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 ).

Execução retardada

Uma típica LINQ consulta semelhante do exemplo anterior, na qual evensQuery está definido. Ele cria a consulta, mas não executá-la imediatamente. Em vez disso, a definição de consulta é armazenada na variável de consulta evensQuery. Executar a consulta posteriormente, normalmente usando um For Each loop, que retorna uma seqüência de valores, ou aplicando um operador de consulta padrão, como Count ou Max. Esse processo é conhecido como execução adiada .

' Query execution that results in a sequence of values.
For Each number In evensQuery
    Console.Write(number & " ")
Next

' Query execution that results in a single value.
Dim evens = evensQuery.Count()

Para uma seqüência de valores, você deve acessar os dados recuperados usando a variável de iteração na For Each loop (number no exemplo anterior). Porque a variável de consulta, evensQuery, contém a definição de consulta em vez de usar os resultados da consulta, você pode executar uma consulta com a freqüência que desejar, usando a variável de consulta mais de uma vez. Por exemplo, você pode ter um banco de dados em seu aplicativo que está sendo atualizado continuamente por um aplicativo separado. Após você ter criado uma consulta que recupera dados do banco de dados, você pode usar um For Each um loop para executar a consulta repetidamente, recuperando os dados mais recentes cada vez.

O exemplo a seguir demonstra a execução retardada como funciona. Depois de evensQuery2 é definido e executado com um For Each loop, como nos exemplos anteriores, alguns elementos na fonte de dados numbers são alteradas. Em seguida, um segundo For Each loop é executado evensQuery2 novamente. Os resultados são diferentes na segunda vez, porque o For Each o loop é executado novamente, a consulta usando os novos valores em numbers.

Dim numberArray() = {0, 1, 2, 3, 4, 5, 6}

Dim evensQuery2 = From num In numberArray
                  Where num Mod 2 = 0
                  Select num

Console.WriteLine("Evens in original array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

' Change a few array elements.
numberArray(1) = 10
numberArray(4) = 22
numberArray(6) = 8

' Run the same query again.
Console.WriteLine(vbCrLf & "Evens in changed array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

Saída:

Evens in original array:

0 2 4 6

Evens in changed array:

0 10 2 22 8

Execução imediata

Na execução retardada de consultas, a definição de consulta é armazenada em uma variável de consulta para posterior execução. Na execução imediata, a consulta é executada no momento da sua definição. Execução é disparada quando você aplica um método que requer acesso aos elementos individuais do resultado da consulta. Geralmente, a execução imediata é forçada usando um dos operadores de consulta padrão que retornam valores únicos. Examples are Count, Max, Average, and First. Esses operadores de consulta padrão executar a consulta, assim que elas são aplicadas para calcular e retornar um resultado singleton. Para obter mais informações sobre os operadores de consulta padrão que retornam valores únicos, consulte Operações de agregação, Operações de elemento, e Operações de quantificador.

A consulta a seguir retorna uma contagem de números pares em uma matriz de inteiros. A definição de consulta não é salva, e numEvens é uma simples Integer.

Dim numEvens = (From num In numbers
                Where num Mod 2 = 0
                Select num).Count()

Você pode obter o mesmo resultado usando o Aggregate método.

Dim numEvensAgg = Aggregate num In numbers
                  Where num Mod 2 = 0
                  Select num
                  Into Count()

Você também pode forçar a execução de uma consulta chamando o ToList ou ToArray método em uma consulta (imediata) ou uma variável de consulta (diferido), conforme mostrado no código a seguir.

' Immediate execution.
Dim evensList = (From num In numbers
                 Where num Mod 2 = 0
                 Select num).ToList()

' Deferred execution.
Dim evensQuery3 = From num In numbers
                  Where num Mod 2 = 0
                  Select num
' . . .
Dim evensArray = evensQuery3.ToArray()

Nos exemplos anteriores, evensQuery3 é uma consulta de variável, mas evensList é uma lista e evensArray é uma matriz.

Usando ToList ou ToArray imediata de forçar a execução é especialmente útil em cenários nos quais você deseja executar a consulta imediatamente e armazenar em cache os resultados em um objeto de coleção única. Para obter mais informações sobre estes métodos, consulte Convertendo tipos de dados.

Você também pode causar uma consulta a ser executada usando um IEnumerable método como o IEnumerable.GetEnumerator método.

Demonstrações de vídeo relacionados

Como faço Começar com o LINQ?

Vídeo como: Escrever consultas em Visual Basic

Consulte também

Tarefas

Amostras do LINQ

Conceitos

O/R Designer Overview

Inferência de tipo de variável local (Visual Basic)

Visão geral operadores de consulta padrão

Introdução ao LINQ no Visual Basic

Outros recursos

Guia de Introdução do LINQ em Visual Basic

LINQ no Visual Basic

Consultas(Visual Basic)

Histórico de alterações

Date

History

Motivo

Março de 2011

Modificou o último exemplo.

Comentários do cliente.