Introdução às consultas do LINQ

A consulta é uma expressão que recupera dados de uma fonte de dados.Consultas normalmente são expressos em uma linguagem de consulta especializadas.Diferentes idiomas têm sido desenvolvidos ao longo do time para os vários tipos de fontes de dados, por exemplo SQL para bancos de dados relacionais e XQuery para XML.Portanto, os desenvolvedores tiveram de aprender uma nova linguagem de consulta para cada tipo de fonte de dados ou formato de dados que eles precisam suportar.LINQ simplifica essa 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, ADO.NET DataSets, .NET coleções e qualquer Outros formato para que um LINQ o provedor está disponível.

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

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

  1. Obter 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 em código-fonte.O exemplo usa uma matriz de inteiros sistema autônomo uma fonte de dados para sua conveniência; no entanto, sistema autônomo mesmos conceitos se aplicam a Outros 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 de consulta completa.In LINQ a execução da consulta é diferente da própria consulta; em outras palavras não recuperar os dados apenas através da criação de uma variável de consulta.

A fonte de dados

No exemplo anterior, porque a fonte de dados é uma matriz, ele implicitamente suporta a genéricoIEnumerable<T> interface. Esse fato significa que podem ser consultada com LINQ. Uma consulta é executada em um foreach demonstrativo, e foreach requer IEnumerable ou IEnumerable<T>. Tipos que oferecem suporte a IEnumerable<T> ou uma interface derivada, sistema autônomo a genérica IQueryable<T> são chamados tipos que podem ser consultados.

A tipo passível de consulta requer sem modificação ou tratamento especial para servir sistema autônomo um LINQ fonte de dados. Se sistema autônomo dados de fonte não estiver na memória sistema autônomo um tipo que podem ser consultado, o LINQ provedor deve representá-lo sistema autônomo tal. Por exemplo, LINQ to XML carrega um documento XML em um que podem ser consultados XElement tipo:

// Create a data source from an XML document.
// using System.Xml.Linq;
XElement contacts = 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, Customer representa uma tabela específica no banco de dados, e Table<Customer> oferece suporte genérico IQueryable<T>, que deriva de IEnumerable<T>.

// Create a data source from a SQL Server database.
// using System.Data.Linq;
DataContext db = new DataContext(@"c:\northwind\northwnd.mdf");

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. No entanto, a regra básica é muito 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 um LINQ fonte de dados. Para obter mais informações, consulte Como: consulta uma ArrayList com LINQ.

A consulta

A consulta Especifica quais informações para recuperar a partir da fonte de dados ou fontes.Opcionalmente, uma consulta também especifica como as informações devem ser classificadas, agrupadas e em forma antes que ele é retornado.Uma consulta é armazenada em uma variável de consulta e inicializada com uma expressão de consulta.Para tornar mais fácil escrever consultas, translation from VPE for Csharp apresentou a nova sintaxe de consulta.

A consulta no exemplo anterior retorna todos os números pares 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ê vai ter percebido que a ordem das cláusulas é revertida com a ordem no SQL.) The from cláusula Especifica a fonte de dados, o where cláusula aplica o filtro e o select cláusula Especifica o tipo de elementos retornados. Essas e outras cláusulas de consulta são discutidas detalhadamente no Expressões de consulta LINQ (Guia de programação C#) seção. Por enquanto, o ponto importante é que em LINQ, a variável de consulta não realiza nenhuma ação e retornará sem dados. Ele apenas armazena as informações necessárias para produzir os resultados quando a consulta é executada em algum momento posterior.Para obter mais informações sobre como consultas são construídas em segundo plano, consulte Visão geral de operadores de consulta padrão.

Observação:

Consultas também podem ser expressos usando sintaxe do método.Para obter mais informações, consulte Sintaxe de consulta em relação a sintaxe do método (LINQ).

Execução de consulta

Execução retardada

Conforme mencionado anteriormente, a variável de consulta armazena apenas sistema autônomo comandos de consulta.A execução da consulta real é adiada até que você iterar a variável de consulta um foreach demonstrativo. Esse conceito é conhecido sistema autônomo execução retardada e é demonstrado no exemplo a seguir:

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

The foreach demonstrativo também é onde os resultados da consulta são recuperados. Por exemplo, na consulta anterior, a variável de iteração num mantém cada valor (um por um time) na sequência retornada.

sistema autônomo a variável de consulta nunca armazena sistema autônomo resultados da consulta, você pode executar-lo sempre que desejar.Por exemplo, talvez seja necessário um banco de dados que está sendo atualizado continuamente por um aplicativo separado.Em seu aplicativo, é possível criar uma consulta que recupera os dados mais recentes e pode executá-lo repetidamente alguns intervalos para recuperar resultados diferentes cada vez.

Forçar execução imediata

Consultas que realizam funções de agregação em um intervalo de elementos de fonte devem primeiro iterar sobre esses elementos.Exemplos de tais consultas são Count, Max, Average, e First. Esses executar sem uma explícita foreach demonstrativo porque a consulta em si deve usar foreach para retornar um resultado. Observe também que esses tipos de consultas retornam um valor único, não um IEnumerable coleção. A seguinte consulta retorna uma contagem de números pares na matriz de fonte:

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 seus resultados, você pode chamar o ToList<TSource> ou ToArray<TSource> métodos.

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();

Também é possível forçar a execução, colocando o foreach loop imediatamente após a expressão de consulta. No entanto, chamar por ToList ou ToArray Você também armazenar em cache todos os dados em um objeto de coleção única.

Consulte também

Conceitos

O/R Designer Overview

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

Referência

foreach, (C# Referência)

Outros recursos

Introdução ao LINQ in translation from VPE for Csharp

Exemplos LINQ

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

O LINQ e execução adiados vídeo