Compartilhar via


Sintaxe de consulta em relação a sintaxe do método (LINQ)

A maioria das consultas no introdutório LINQ documentação são gravados sistema autônomo expressões de consulta usando a sintaxe declarativa consulta introduzida no translation from VPE for Csharp 3.0. No entanto, o .NET common linguagem tempo de execução (CLR) não tenha noção de sintaxe de consulta em si.Portanto, no momento da compilar, expressões de consulta são convertidas em algo que o CLR entender: chamadas de método.Esses métodos são chamados de operadores de consulta padrão e eles têm nomes sistema autônomo Where, Select, GroupBy, Join, Max, Average, e assim por diante. Você pode chamá-los diretamente usando sintaxe do método em vez da sintaxe de consulta.

Em geral, recomendamos a sintaxe de consulta porque ele é geralmente mais simples e mais legível; entretanto não há nenhuma diferença semântica entre sintaxe do método e a sintaxe de consulta.Além disso, algumas consultas, sistema autônomo aqueles que recuperar o número de elementos que coincidam com uma condição especificada, ou recuperar o elemento que possui o valor máximo em uma sequência de fonte, somente pode ser expresso sistema autônomo chamadas de método.A documentação de referência para os operadores de consulta padrão no System.Linq espaço para nome geralmente usa a sintaxe do método. Portanto, mesmo quando começar a escrever LINQ consultas, é útil estar familiarizado com o modo de usar a sintaxe do método em consultas e em expressões de consulta propriamente ditas.

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

O exemplo a seguir mostra um simples expressão de consulta a consulta semanticamente equivalente gravado sistema autônomo um e consulta baseada 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 é idêntica.Você pode ver que tipo de variável de consulta é o mesmo em ambos os formulários: IEnumerable<T>.

Para compreender a consulta baseada em método, vamos examinar-mais de perto.No lado direito da expressão, observe que o where cláusula agora é expressa sistema autônomo um método de instância na numbers tem o tipo de objeto, que, sistema autônomo você irá se lembrar IEnumerable<int>. Se você estiver familiarizado com o genéricoIEnumerable<T> interface, você sabe que ele não têm um Where método. No entanto, se você chamar a lista de conclusão IntelliSense no Visual Studio IDE, verá não só um Where método, mas muitos outros métodos, sistema autônomo Select, SelectMany, Join, e Orderby. Esses são os operadores de consulta padrão.

Embora ela aparece sistema autônomo se IEnumerable<T> foi redefinido para incluir esses métodos adicionais, no fato de que não for esse o caso. sistema autônomo operadores de consulta padrão são implementados sistema autônomo um novo tipo de método chamado métodos de extensão.Métodos de extensões "estender" um tipo existente, pode ser chamados sistema autônomo se fossem métodos de instância no tipo.Os operadores de consulta padrão estendem IEnumerable<T> e isto é porque você pode gravar numbers.Where(...).

Para começar a usar LINQ, tudo o que você realmente precisa saber sobre os métodos de extensão é como colocá-los para o escopo do aplicativo usando o correto using diretivas. Isso é explicado Além disso Como: Criar um projeto LINQ. Do ponto de vista do aplicativo, um método de extensão e um método de instância normais são os mesmos.

Para obter mais informações sobre estes métodos de extensão, consulte Métodos de extensão (Guia de programação C#).Para obter mais informações sobre os operadores de consulta padrão, consulte Guia de programação do LINQ geral e Visão geral de operadores de consulta padrão. Alguns LINQ provedores, sistema autônomo LINQ to SQL e LINQ to XML, implementar seus próprios operadores de consulta padrão e sistema autônomo métodos de extensão adicional para outros tipos além IEnumerable<T>.

Expressões Lambda

No exemplo anterior, observe que a expressão condicional (num % 2 == 0) é passado sistema autônomo um argumento na linha para o Where método: Where(num => num % 2 == 0). Essa expressão in-line é chamado de uma expressão lambda. É uma maneira conveniente para escrever código que tivesse a serem gravados no formulário mais complicado sistema autônomo um método anônimo ou um delegado genérico ou uma árvore de expressão.In C# =>é o operador lambda, que é lido sistema autônomo "vai para". The num à esquerda do operador é a variável de entrada que corresponde ao num na expressão de consulta. O compilador pode inferir o tipo de num como ele sabe que numbers é um genérico IEnumerable<T> Digite. O corpo do lambda mesmo da expressão em sintaxe de consulta ou em qualquer Outros translation from VPE for Csharp expressão ou demonstrativo; pode incluir chamadas de método e Outros lógica complexa.O "return valor" é apenas o resultado da expressão.

Para começar a usar LINQ, não é necessário usar lambdas extensivamente. No entanto, determinadas consultas só podem ser expressos na sintaxe do método e alguns deles requerem expressões lambda.Depois que você se familiarizar com lambdas, você encontrará o que eles são uma ferramenta poderosa e flexível no seu LINQ caixa de ferramentas. Para obter mais informações, consulte Expressões lambda (Guia de programação C#).

Composição de consultas

No exemplo de código anterior, que não o OrderBy método é chamado usando o operador ponto na telefonar para Where. Where produz uma sequência filtrada e, em seguida, Orderby opera em dessa sequência, classificando-lo. Como consultas retornam uma IEnumerable, você compõe-los na sintaxe do método, as chamadas de método de encadeamento juntas. Este é o que o compilador faz em segundo plano quando você escrever consultas usando sintaxe de consulta.E sistema autônomo uma variável de consulta não armazenar sistema autônomo resultados da consulta, você poderá modificá-la ou usá-lo sistema autônomo base para uma nova consulta em qualquer time, mesmo depois que tiver sido executada.

Consulte também

Outros recursos

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