Compartilhar via


Introdução às consultas do LINQ (C#)

Uma consulta é uma expressão que recupera dados de uma fonte de dados.Consultas são expressas geralmente em uma linguagem de consulta especializado.Os idiomas diferentes foram desenvolvidos ao longo do tempo para os vários tipos de fontes de dados, por exemplo SQL para bancos de dados relacionais e XQuery para XML.Como consequência, os desenvolvedores tinham que saber um novo linguagem de consulta para cada tipo de fonte de dados ou de formato de dados que devem suportar.LINQ simplifica essa 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, em bancos de dados SQL, em datasets de ADO.NET , em coleções .NET, e em qualquer outro formato para que um provedor de LINQ está disponível.

Três partes de uma operação de consulta

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

  1. Obtenha a fonte de dados.

  2. Crie a consulta.

  3. Executar a consulta.

O exemplo a seguir mostra como as três partes de uma operação de consulta são expressas no código-fonte.O exemplo usa uma matriz de inteiros como uma fonte de dados para sua conveniência; no entanto, os mesmos conceitos se aplicam a outras fontes de dados também.Este exemplo é chamado em todo o restante deste tópico.

class IntroToLINQ
{        
    static void Main()
    {
        // The Three Parts of a LINQ Query:
        //  1. Data source.
        int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

        // 2. Query creation.
        // numQuery is an IEnumerable<int>
        var numQuery =
            from num in numbers
            where (num % 2) == 0
            select num;

        // 3. Query execution.
        foreach (int num in numQuery)
        {
            Console.Write("{0,1} ", num);
        }
    }
}

A ilustração a seguir mostra a operação completo de consulta.Em LINQ a execução da consulta é distinta de consulta própria; em outras palavras você recuperou os dados não apenas criando uma variável de consulta.

Concluir a operação de consulta LINQ

A fonte de dados

No exemplo anterior, porque a fonte de dados for uma matriz, implicitamente oferece suporte a interface genérica de IEnumerable<T> .Esse fato significa que pode ser consultado com LINQ.Uma consulta é executada em uma instrução de foreach , e foreach requer IEnumerable ou IEnumerable<T>. Tipos esse suporte IEnumerable<T> ou uma interface derivada como IQueryable<T> genérico é chamada queryable tipos.

Um tipo passível não requer qualquer alteração ou tratamento especial servir como uma fonte de dados de LINQ .Se os dados de origem não estão mais na memória como um tipo passível, o provedor de LINQ deve representá-lo tal como.Por exemplo, LINQ to XML carregar um documento XML em um tipo passível de XElement :

// Create a data source from an XML document.
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");

Com LINQ to SQL, você primeiro cria mapear um objeto em tempo de design manualmente ou usando Object Relational Designer (O/R Designer).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 o tipo do resultado da consulta, IQueryable<T>, deriva de IEnumerable<T>.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

// Query for customers in London.
IQueryable<Customer> custQuery =
    from cust in db.Customers
    where cust.City == "London"
    select cust;

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 .No entanto, a regra básica é muito simples: uma fonte de dados de LINQ é qualquer objeto que ofereça suporte a interface genérica de IEnumerable<T> , ou uma interface que herda de ela.

ObservaçãoObservação

Tipos como ArrayList que oferece suporte a interface não genérica de IEnumerable também pode ser usado como uma fonte de dados de LINQ .Para obter mais informações, consulte Como: consulta um ArrayList com LINQ.

A consulta

A consulta especifica que a recuperar informações de fonte de dados ou de fontes.Opcionalmente, uma consulta também especifica como essas informações devem ser classificados, agrupados, e moldado antes de ser retornada.Uma consulta é armazenada em uma variável de consulta e inicializada com uma expressão de consulta.Para tornar mais fácil escrever consultas, C# introduziu uma nova sintaxe da consulta.

A consulta no exemplo anterior retorna todos os números mesmo da matriz de inteiros.A expressão de consulta contém três cláusulas: from, where e select.(Se você estiver familiarizado com o SQL, você terá observado que a ordem das cláusulas é invertido de ordem em SQL.) A cláusula de from especifica a fonte de dados, a cláusula de where aplica o filtro, e a cláusula de select especifica o tipo dos elementos retornados.Essas e outras cláusulas de consulta são discutidos em detalhes na seção de Expressões de consulta do LINQ (guia de programação do C#) .Por enquanto, o aspecto importante é que em LINQ, a variável de consulta não executa nenhuma ação e não retornam dados.Armazena apenas as informações que é necessária para gerar os resultados quando a consulta é executada em algum ponto posterior.Para obter mais informações sobre como as consultas são construídas nos bastidores, consulte Visão geral operadores de consulta padrão.

ObservaçãoObservação

As consultas também podem ser expressas usando a sintaxe método.Para obter mais informações, consulte Sintaxe de consulta e sintaxe de método em LINQ (C#).

Execução de consulta

Bb397906.collapse_all(pt-br,VS.110).gifExecução adiada

Conforme observado anteriormente, a variável de consulta armazena somente os comandos de consulta.A execução atual da consulta é adiada até que você faz iterações sobre a variável de consulta em uma instrução de foreach .Esse conceito é conhecido como execução adiada e demonstrado no exemplo a seguir:

//  Query execution. 
foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}

A declaração de foreach também é onde os resultados da consulta são recuperados.Por exemplo, a consulta anterior, a variável de iteração num realiza cada valor (um de cada vez) na sequência retornado.

Porque a variável de consulta nunca contém os resultados da consulta, você pode executá-lo tão frequentemente como desejar.Por exemplo, você pode ter um banco de dados que está sendo atualizado continuamente por um aplicativo separado.Em seu aplicativo, você pode criar uma consulta que recupera os dados mais recentes, e você pode executá-lo repetidamente em um determinado intervalo para recuperar todas as vezes resultados diferentes.

Bb397906.collapse_all(pt-br,VS.110).gifForçando a execução imediata

Consulta que executa funções agregadas sobre um intervalo de elementos de origem deve primeiro iterar sobre esses elementos.Exemplos dessas consultas são Count, Max, Average, e First.Esses são executados sem uma declaração explícita de foreach porque a consulta própria deve usar foreach para retornar um resultado.Observe também que esses tipos de consultas retornar um único valor, não uma coleção de IEnumerable .A seguinte consulta retorna uma contagem mesmo de números na matriz de origem:

var evenNumQuery = 
    from num in numbers
    where (num % 2) == 0
    select num;

int evenNumCount = evenNumQuery.Count();

Para forçar a execução imediata de qualquer consulta e armazenar em cache os resultados, você pode chamar os métodos de ToList<TSource> ou de ToArray<TSource> .

List<int> numQuery2 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToList();

// or like this:
// numQuery3 is still an int[]

var numQuery3 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToArray();

Você também pode forçar a execução colocando o loop de foreach imediatamente após a expressão de consulta.No entanto, chamando ToList ou ToArray você também armazena todos os dados em um único objeto da coleção.

Consulte também

Tarefas

Passo a passo: Escrever consultas em C# (LINQ)

Amostras do LINQ

Referência

foreach, (C# Reference)

Conceitos

O/R Designer Overview

Expressões de consulta do LINQ (guia de programação do C#)

Outros recursos

Guia de Introdução do LINQ em C#

Palavras-chave de consulta (referência de C#)

LINQ e exibição de execução adiada