Compartilhar via


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

A consulta é uma expressão que recupera dados de uma fonte de dados. As consultas normalmente são expressas em uma linguagem especializada de consulta. Diferentes linguagens foram desenvolvidas ao longo do tempo para os diversos tipos de fontes de dados, como por exemplo SQL para bancos de dados relacionais e XQuery para XML. Portanto, os desenvolvedores tiveram que aprender uma nova linguagem de consulta para cada tipo de fonte de dados ou formato de dados que eles devem oferecer suporte. LINQsimplifica a essa 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ê usar os mesmos padrões de codificação básicos para consulta e transformar dados em documentos XML, bancos de dados SQL, ADO.NET Datasets,.NET coleções e qualquer outro formato para o qual um LINQ o provedor está disponível.

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

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

  1. Obtenha a fonte de dados.

  2. Crie a consulta.

  3. Execute a consulta.

O exemplo a seguir mostra como as três partes de uma operação de consulta são expressos 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 de consulta completa. Na LINQ a execução da consulta é distinta da consulta em si; em outras palavras não recuperar os dados apenas através da criação de uma variável de consulta.

Concluir operação de consulta LINQ

A fonte de dados

No exemplo anterior, porque a fonte de dados é uma matriz, ele implicitamente suporta genérico IEnumerable<T> interface. Esse fato significa que ele pode ser consultado com LINQ. Uma consulta é executada em um foreach de instrução, e foreach requer IEnumerable ou IEnumerable<T>. Tipos que oferecem suporte à IEnumerable<T> ou uma interface derivada como genérico IQueryable<T> são chamados de tipos consultáveis.

Um tipo que podem ser consultado não requer nenhuma modificação ou tratamento especial para servir como um LINQ dados de origem. Se os dados de origem não ainda estiver na memória como um tipo que podem ser consultado, o LINQ provedor deve representá-lo como tal. Por exemplo, LINQ to XML carrega um documento XML em um queryable 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, 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 o tipo de resultado da consulta, IQueryable<T>, que 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 as várias LINQ provedores. No entanto, a regra básica é muito 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 um LINQ dados de origem. Para obter mais informações, consulte Como: Consultar um ArrayList com LINQ.

A consulta.

A consulta especifica quais informações recuperar a partir da (ou das) fonte de dados. Opcionalmente, uma consulta também especifica como as informações devem ser classificadas agrupadas e moldadas 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, C# apresentou nova sintaxe de consulta.

A consulta no exemplo anterior retorna todos os números pares na matriz de inteiros. A expressão de consulta contém três cláusulas: from, where and select. (Se você estiver familiarizado com o SQL, você irá ter percebido que a ordem das cláusulas é revertida com a ordem de SQL.) O 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 em detalhes o <>>Expressões de consulta do LINQ (guia de programação TRANSLATION FROM VPE FOR CSHARP) seção. Por enquanto, o ponto importante é que, em LINQ, a variável de consulta não faz nada e retorna sem dados. Ela apenas armazena as informações que são necessárias para produzir os resultados quando a consulta for executada em algum momento 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 o método sintaxe. Para obter mais informações, consulte Sintaxe de consulta do LINQ em comparação com a sintaxe do método (C#).

Execução da consulta

Execução retardada

Como mencionado anteriormente, a variável de consulta somente armazena os comandos de consulta. A execução real da consulta é adiada até que você itera a variável de consulta em um foreach instrução. Esse conceito é conhecido como execução retardada e é demonstrado no exemplo a seguir:

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

O foreach instrução 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 de cada vez) na seqüência retornado.

Como a própria variável de consulta nunca mantém os resultados da consulta, você pode executá-la com tanta freqüência quanto desejar. Por exemplo, você pode ter um banco de dados que está sendo atualizado continuamente por um aplicativo separado. Em seu aplicativo, você poderia criar uma consulta que recupera os dados mais recentes e você pode executá-la repetidamente alguns intervalos para recuperar resultados diferentes a cada vez.

Forçar a execução imediata

Consultas que realizam funções de agregação em um intervalo de elementos de origem devem primeiro iterar a esses elementos. Exemplos de tais consultas são Count, Max, Average, e First. Execução sem um explícita foreach instrução porque a consulta em si deve usar foreach para retornar um resultado. Observe também que esses tipos de consultas retornam um único valor, não um IEnumerable coleção. A seguinte consulta retorna um contador dos números de pares 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 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();

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

Consulte também

Tarefas

Amostras do LINQ

Referência

foreach, (TRANSLATION FROM VPE FOR CSHARP Reference)

Conceitos

O/R Designer Overview

<>>Expressões de consulta do LINQ (guia de programação TRANSLATION FROM VPE FOR CSHARP)

Outros recursos

Guia de Introdução do LINQ em C#

Palavras-chave de consulta (referência de TRANSLATION FROM VPE FOR CSHARP)

LINQ e adiados vídeo de execução