Compartilhar via


Gravar sua consulta LINQ primeira (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.Com o passar do time, 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ária para o desenvolvedor do aplicativo aprender uma nova linguagem de consulta para cada tipo de fonte de dados ou formato de dados para o qual há suporte.

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. In a LINQ consulta, está sempre trabalhando com objetos. Você usa os mesmos padrões de codificação básicos para consultar e transformar dados em documentos XML, bancos de dados SQL, datasets ADO.NET e entidades, coleções do .NET estrutura e qualquer Outros fonte ou formato para o qual um LINQ o provedor está disponível. Este documento descreve as três fases da criação e o uso do básico LINQ consultas.

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

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

  1. Obter a fonte de dados ou fontes.

  2. Crie a consulta.

  3. executar a consulta.

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

O exemplo a seguir ilustra três partes de uma operação de consulta.O exemplo usa uma matriz de inteiros sistema autônomo uma fonte de dados conveniente para fins de demonstração.No entanto, os mesmos conceitos se aplicam também 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 a genéricoIEnumerable<T> interface. É esse fato permite que você use uma matriz sistema autônomo uma fonte de dados para um LINQ consulta. Tipos que oferecem suporte a IEnumerable (Of T) ou em uma interface derivada, sistema autônomo a genéricoIQueryable<T>, são chamados tipos que podem ser consultados.

sistema autônomo um implicitamente tipo passível de consulta, a matriz não exige nenhum modificação ou tratamento especial para servir sistema autônomo um LINQ fonte de dados. O mesmo é verdadeiro para qualquer tipo de coleção que ofereça suporte a IEnumerable (of t), incluindo o genéricoList<T>, Dictionary<TKey, TValue>e outras classes na biblioteca de classes do .NET estrutura.

Se os dados de origem já não implementam IEnumerable (of t), um LINQ provedor é necessário para implementar a funcionalidade dos operadores de consulta padrão para essa fonte de dados.Por exemplo, LINQ to XML manipula o trabalho de carregar um documento XML em um que podem ser consultados XElement tipo, sistema autônomo mostrado no exemplo a seguir. Para obter mais informações sobre os operadores de consulta padrão, consulte Visão geral de operadores de consulta padrão.

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

Com LINQ to SQL, você cria um mapeamento relacional de objeto em time de design, manualmente ou usando o Object Relational Designer (O/R Designer). Você gravar suas consultas em relação os objetos e no time de execução LINQ to SQL lida com a comunicação com o banco de dados. No exemplo a seguir, customers representa uma tabela específica no banco de dados, e Table<TEntity> oferece suporte 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 referente a vários LINQ provedores. (Para obter uma lista desses provedores, consulte LINQ (consulta integrada à linguagem).) A regra básica é simples: a LINQ fonte de dados é qualquer objeto que suporte a genérica IEnumerable<T> interface, ou uma interface que herda dela.

Observação:

Tipos, sistema autônomo ArrayList que suporte não genérica IEnumerable interface também pode ser usado sistema autônomo LINQ fontes de dados. Para obter um exemplo que usa um ArrayList, consulte Como: consulta uma ArrayList com LINQ.

A consulta

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

Quando ele é executado, a consulta no exemplo a seguir retorna todos os números de 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, e Select. A função específica e a finalidade de cada cláusula de expressão de consulta é discutida no Operações de consulta básica (Visual Basic). Para obter mais informações, consulte Consultas(Visual Basic). Observe que em LINQ, uma definição de consulta geralmente é armazenada em uma variável e executada posteriormente. A variável de consulta, sistema autônomo evensQuery no exemplo anterior, deve ser um tipo de que podem ser consultado. O tipo de evensQuery é IEnumerable(Of Integer), atribuído pelo compilador usando inferência de tipos de tipos local.

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

Execução de 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

Um típico LINQ consulta semelhante no exemplo anterior, no qual evensQuery está definido. Ele cria a consulta, mas não o executa imediatamente.Em vez disso, a definição de consulta é armazenada no consulta variável evensQuery. Executar a consulta posteriormente, normalmente usando um For Each loop, que retorna uma sequência de valores ou aplicando um operador de consulta padrão, sistema autônomo 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 sequência de valores, você acessa os dados recuperados usando a variável de iteração no For Each loop)number no exemplo anterior). Porque a consulta variável, evensQuery, mantém a definição de consulta em vez de resultados da consulta, você pode executar uma consulta sempre que você deseja usando a variável de consulta mais de um time. Por exemplo, você pode ter um banco de dados em seu aplicativo que está sendo atualizado continuamente por um aplicativo separado.Depois de criar uma consulta que recupera dados do banco de dados, você pode usar um For Each loop para executar a consulta repetidamente, recuperando os dados mais recentes cada time.

O exemplo a seguir demonstra a execução retardada como funciona.Depois de evensQuery2 é definido e executado com um For Each loop, sistema autônomo 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 a segunda time, porque o For Each loop executa a consulta novamente, usando os novos valores em numbers.

Dim numberArray() As Integer = {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

Em execução retardada de consultas, a definição da consulta é armazenada em uma variável de consulta para mais tarde.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.Com freqüência para execução imediata é forçada usando um dos operadores de consulta padrão que retornam valores únicos.Exemplos são Count, Max, Average, e First. Esses operadores de consulta padrão executar a consulta sistema autônomo logo sistema autônomo eles são aplicados 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 seguinte consulta retorna uma contagem de números pares em uma matriz de inteiros.A definição de consulta não for salvo 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()

Também é possível forçar a execução de uma consulta chamando o ToList ou ToArray método em uma consulta (imediata) ou a 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 = evensQuery.ToArray()

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

Usando ToList ou ToArray para forçar imediata execução é especialmente útil em situações em que 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 Converter tipos de dados.

Você também pode fazer com que uma consulta a ser executada usando um IEnumerable método, sistema autônomo o Método GetEnumerator (Objeto da Coleção).

Consulte também

Tarefas

Consultas de exemplo (Visual Basic)

Conceitos

O/R Designer Overview

Inferência de tipos local

Visão geral de operadores de consulta padrão

Introdução ao LINQ no Visual Basic

Outros recursos

Introdução ao LINQ no Visual Basic

Exemplos LINQ

LINQ no Visual Basic

Consultas(Visual Basic)