Escrevendo a primeira consulta LINQ (Visual Basic)
Uma 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, os idiomas diferentes foram desenvolvidos para tipos diferentes de fontes de dados, por exemplo, SQL para bancos de dados relacionais e XQuery para XML. Isso é necessário para que o desenvolvedor de aplicativos saber um novo linguagem de consulta para cada tipo de fonte de dados ou de formato de dados que são suportados.
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 uma consulta de LINQ , você está sempre trabalhando com objetos. Você usa os mesmos padrões de codificação básica para ver os dados e transformar documentos XML, os bancos de dados SQL, datasets e as entidades ADO.NET, coleções do .NET Framework, e a qualquer outra fonte ou formato para que um provedor de LINQ está disponível. Este documento descreve as três fases de criação e uso de LINQ básico consulta.
Demonstração de vídeo para relacionada, consulte Como: eu faço Guia de introdução com LINQ?.
Três estágios de uma operação de consulta
as operações consulta deLINQ consistem em três ações:
Obtenha a fonte de dados ou fontes.
Crie a consulta.
Executar a consulta.
Em LINQ, a execução de uma consulta é distinta de criação de consulta. Você não recupera os dados apenas criando uma consulta. Este ponto é abordado em 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.
Dica
Em Página de Compilação, Designer de Projeto (Visual Basic), certifique-se de que Opção Infer está definido como Ativado.
' 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 oferece suporte a interface genérica de IEnumerable . É o fato que permite que você use uma matriz como uma fonte de dados para uma consulta de LINQ . Tipos esse suporte IEnumerable ou uma interface derivada como IQueryable genérico é chamada queryable tipos.
Como um tipo passível implicitamente, a matriz não requer qualquer alteração ou tratamento especial servir como uma fonte de dados de LINQ . O mesmo vale para qualquer tipo de coleção que suporte IEnumerable, incluindo Listgenérico, Dictionary, e outras classes do.NET Framework a biblioteca de classes.
Se os dados de origem não implementam IEnumerable, um provedor de LINQ é necessário para implementar a funcionalidade dos operadores de consulta padrão para a fonte de dados. Por exemplo, LINQ to XML trata o trabalho de carregar um documento XML em um tipo passível de XElement , conforme mostrado no exemplo o seguir. Para obter mais informações sobre 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 = XElement.Load("c:\myContactList.xml")
Com LINQ to SQL, você primeiro cria mapear um objeto em tempo de design, manualmente ou usando Designer Relacional de Objetos. Você escreve suas consultas nos objetos, e em tempo de execução LINQ to SQL trata a comunicação com o banco de dados. No exemplo, customers representa uma tabela específica no banco de dados, e oferece suporte IQueryablegenérica de Table .
' 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 vários provedores de LINQ . (Para obter uma lista desses provedores, LINQ (Consulta Integrada à Linguagem)consulte.) A regra básica é simples: uma fonte de dados de LINQ é qualquer objeto que ofereça suporte a interface genérica de IEnumerable , ou uma interface que herda de ela.
Dica
Tipos como ArrayList que oferece suporte a interface não genérica de IEnumerable também pode ser usado como fontes de dados de LINQ .Para um exemplo que usa ArrayList, consulte Como consultar um ArrayList com LINQ.
A consulta
Na consulta, você especifica que você deseja recuperar informações de fonte de dados ou de fontes. Você também tem a opção de especificar como essas informações devem ser classificados, agrupados, ou estruturada antes de ser retornada. Para ativar a criação de consulta, o Visual Basic inseriu a nova sintaxe da consulta na linguagem.
Quando é executado, a consulta no exemplo a seguir retorna todos os mesmo números 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 são discutidas em 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. Variável de consulta, como evensQuery no exemplo anterior, deve ser um tipo passível. O tipo de evensQuery é IEnumerable(Of Integer), atribuído pelo compilador que usa inferência de tipos local.
É importante lembrar que a variável de consulta não executa nenhuma ação e não retornam dados. Armazena apenas a definição de consulta. No exemplo anterior, é o loop de For Each que executa a consulta.
Execução de consulta
A execução da consulta é separada da criação de consulta. A 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 adiada
Uma consulta típica de LINQ é semelhante ao no exemplo anterior, em que evensQuery é definido. Cria a consulta mas não a execução imediatamente. Em vez disso, a definição de consulta é armazenado na variável evensQueryde consulta. Você executa a consulta posteriormente, normalmente usando um loop de For Each , que retorna uma sequência de valores, ou aplicando um operador padrão de consulta, 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 sequência de valores, você acessa os dados recuperados usando a variável de iteração do loop de For Each (number no exemplo anterior). Porque a variável de consulta, evensQuery, mantém a definição de consulta em vez da resultados de consulta, você pode executar uma consulta tão frequentemente como você deseja 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. Depois de criar uma consulta que recupera dados do banco de dados, você pode usar um loop de For Each para executar repetidamente a consulta, obter os dados mais recentes sempre.
O exemplo a seguir demonstra como execução adiada funciona. Depois que evensQuery2 é definido e executado com um loop de For Each , como nos exemplos anteriores, alguns elementos na fonte de dados numbers são alterados. Em um loop de For Each do segundo executa evensQuery2 novamente. Os resultados são diferentes a segunda vez, porque o loop de For Each executa a consulta novamente, 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
Em execução adiada de consultas, a definição de consulta é armazenada em uma variável de consulta para uma execução mais recente. Na execução imediata, a consulta é executada no momento da sua definição. A execução é acionada quando você aplica um método que requer acesso aos elementos individuais do resultado da consulta. A execução imediata forçada é geralmente usando um dos operadores de consulta padrão que retornam valores únicos. Os exemplos são Count, Max, Average, e First. Esses operadores de consulta padrão executam a consulta para que são aplicados para calcular e retornar um resultado singleton. Para obter mais informações sobre 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 mesmo números em uma matriz de inteiros. A definição de consulta não é salva, e numEvens é Integersimples.
Dim numEvens = (From num In numbers
Where num Mod 2 = 0
Select num).Count()
Você pode obter o mesmo resultado usando o método de Aggregate .
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 método de ToList ou de ToArray em uma consulta (imediata) ou na variável de consulta () postergado, 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 variável de consulta, mas evensList é uma lista e evensArray é uma matriz.
Usar ToList ou ToArray para forçar a execução imediata é especialmente útil em situações em que você deseja executar a consulta imediatamente e armazenar em cache os resultados em uma única coleção objeto. Para obter mais informações sobre estes métodos, consulte Convertendo tipos de dados.
Você também pode causar uma consulta seja executada usando um método de IEnumerable como o método de System#Collections#IEnumerable#GetEnumerator .
Demonstrações de vídeo relacionadas
Como: eu faço Guia de introdução com LINQ?
Como: exibição Escrevendo consultas no Visual Basic
Consulte também
Tarefas
Conceitos
Inferência de tipo local (Visual Basic)
Visão geral de operadores de consulta padrão
Introdução a LINQ no Visual Basic