Compartilhar via


Sintaxe de consulta e sintaxe de método em LINQ (C#)

A maioria de consultas linguagem introdutório na documentação de consulta integradaLINQ() são escritas usando a sintaxe declarativa de consulta LINQ. No entanto, a sintaxe da consulta deve ser convertida em chamadas de método para o tempo de execução (CLR) language runtime .NET quando o código é compilado. Essas chamadas de método invoke os operadores de consulta padrão, que têm nomes como Where, Select, GroupBy, Join, Max, e Average. Você pode os chama diretamente usando a sintaxe método em vez da sintaxe da consulta.

A sintaxe da consulta e a sintaxe do método são semanticamente idênticas, mas muitas pessoas localize a sintaxe da consulta mais simples e mais fácil de ler. Algumas consultas devem ser expressos como chamadas de método. Por exemplo, você deve usar um chamada de método para expressar uma consulta que recupera o número de elementos que correspondem a uma condição especificada. Você também deve usar um chamada de método para uma consulta que recupera o elemento que tem o valor máximo em uma sequência de origem. Documentação de referência para os operadores de consulta padrão no namespace de System.Linq geralmente usa a sintaxe método. Como consequência, mesmo quando introdução ao escrever LINQ consulta, é útil estar familiarizado com como usar a sintaxe de método em consultas e as expressões elas próprias de consulta.

Métodos de extensão padrão de operador de consulta

O exemplo a seguir mostra uma expressão de consulta simples e a consulta semanticamente equivalente gravada como uma consulta com base em método.

class QueryVMethodSyntax
{
    static void Main()
    {
        int[] numbers = { 5, 10, 8, 3, 6, 12};

        //Query syntax:
        IEnumerable<int> numQuery1 = 
            from num in numbers
            where num % 2 == 0
            orderby num
            select num;

        //Method syntax:
        IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);

        foreach (int i in numQuery1)
        {
            Console.Write(i + " ");
        }
        Console.WriteLine(System.Environment.NewLine);
        foreach (int i in numQuery2)
        {
            Console.Write(i + " ");
        }

        // Keep the console open in debug mode.
        Console.WriteLine(System.Environment.NewLine);
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}
/*
    Output:
    6 8 10 12
    6 8 10 12
 */

A saída dos dois exemplos são idênticas. Você pode ver que o tipo da variável de consulta é o mesmo em ambos os formulários: IEnumerable.

Para entender a consulta método base, vamos examinam-na mais próximo. No lado direito da expressão, observe que a cláusula de where agora é expressa como um método de instância no objeto de numbers , como você chamará o tem um tipo de IEnumerable<int>. Se você estiver familiarizado com a interface genérica de IEnumerable , você souber que não tem um método de Where . No entanto, se você chamar a lista para completar do IntelliSense no Visual Studio IDE, você não verá apenas um método de Where , mas muitos outros métodos como Select, SelectMany, Join, e Orderby. Esses são todos os operadores de consulta padrão.

Operadores de consulta padrão no Intellisense

Embora se parece com IEnumerable foi redefinido para incluir esses métodos adicionais, na verdade isso não é o caso. Os operadores de consulta padrão são implementados como um novo tipo de método chamado de métodos de extensão. Os métodos de extensões “estendem”; um tipo existente podem ser chamados como se fossem métodos da instância do tipo. Os operadores de consulta padrão e estendem IEnumerable é o motivo pelo qual você pode escrevernumbers.Where(...).

Para se familiarizar usando LINQ, tudo o que você realmente precise aprender sobre métodos de extensão é como o trazer no escopo do seu aplicativo usando as políticas de using corretas. Isso é explicado adicionalmente em Como criar um projeto LINQ. Do ponto de vista do seu aplicativo, um método de extensão normal e um método de instância são o mesmo.

Para obter mais informações sobre estes métodos de extensão, consulte Métodos de extensão (Guia de Programação em C#). Para obter mais informações sobre operadores de consulta padrão, consulte. Visão geral de operadores de consulta padrão Alguns provedores de LINQ , como LINQ to SQL e LINQ to XML, implementam seus próprios operadores de consulta padrão e métodos adicionais de extensão para outros tipos além de IEnumerable.

Expressões Lambda

No exemplo anterior, observe que a expressão condicional (num % 2 == 0) é passada como um argumento em linha para o método Where: Where(num => num % 2 == 0).Esta expressão in-line é chamada de expressão lambda. É uma maneira conveniente para escrever código que teria que de outro modo ser escrito em um formulário mais incómodo como um método anônimo ou um delegado genérico ou uma árvore de expressão. Em C# => é o operador lambda, que é lida como “go a”. num na esquerda do operador é a variável de entrada que corresponde a num na expressão de consulta. O compilador pode inferir o tipo de num porque ele sabe que numbers é um tipo genérico de IEnumerable . O corpo lambda é apenas o mesmo que a expressão na sintaxe da consulta ou em qualquer outra expressão ou instrução do C#; pode incluir chamadas de método e a outra lógica complexa. “Valor de retorno” é apenas o resultado da expressão.

Para se familiarizar usando LINQ, você não tem que usar lambdas amplamente. No entanto, determinadas consultas só podem ser expressas na sintaxe do método e requer algumas dessas expressões lambda. Depois que você desenvolve mais familiarizado com os lambdas, você verá que são uma ferramenta poderosa e flexível na caixa de ferramentas de LINQ . Para obter mais informações, consulte Expressões lambda (Guia de Programação em C#).

Composability de consultas

No exemplo de código anterior, observe que o método de OrderBy é chamado usando o operador ponto na chamada a Where. Where gera uma sequência filtrada, e então Orderby opera na sequência classificação para. Como as consultas retornam IEnumerable, você compor-las na sintaxe método encadeando chamadas de método juntos. Este é o que o compilador faz nos bastidores quando você escrever consultas usando a sintaxe da consulta. E porque uma variável de consulta não armazena os resultados da consulta, você pode modificá-lo ou usá-lo como a base para uma nova consulta a qualquer momento, mesmo após foi executada.

Consulte também

Outros recursos

Introdução a LINQ em C#