LINQ - Escrevendo consultas LINQ (.NET Core)


Hoje vamos recordar as diferentes formas de escrever consultas LINQ na linguagem C#.

Vamos iniciar recordando que uma consulta LINQ é um objeto IEnumerable genérico a partir do qual você obtém resultados, e, a variável à qual o resultado é atribuído é conhecido como variável de intervalo.

Esta variável é uma coleção não povoada; é apenas um objeto de consulta que pode recuperar dados. O LINQ não acessa os dados de origem até você tentar usar o objeto de consulta para trabalhar com os resultados. Isso é conhecido como execução adiada ou deferred execution.

Para consultas básicas, usar o LINQ com C# é muito fácil e intuitivo, pois o C# fornece palavras-chave que são mapeadas diretamente para os recursos que foram adicionados por meio de métodos de extensão. O benefício é que você pode escrever consultas tipadas de maneira muito semelhante ao SQL, obtendo suporte ao IntelliSense o tempo todo.

O que é preciso para escrever consultas LINQ ?

Para escrever uma consulta LINQ, precisamos definir 3 coisas:

  1. A fonte de dados (objetos na memória, SQL, XML)
  2. A Consulta
  3. Executar a consulta

Uma consulta nada mais é do que um conjunto de instruções aplicadas a uma fonte de dados (por exemplo, objetos na memória, SQL, XML, etc.) para executar determinadas operações (por exemplo, operações CRUD) e, em seguida, informar a forma da saída dessa consulta.

Isso significa que a consulta não é responsável pela saída, e sim pelo formato da saída que é o que vair retornar dessa consulta, se será retornado um valor específico, uma lista ou um objeto específico.

Dessa forma uma consulta pode ser vista como uma combinação de 3 itens importantes:

  1. Inicialização (para trabalhar com uma fonte de dados específica)
  2. Condição (onde, filtro, condição de classificação)
  3. Seleção (seleção única, seleção de grupo ou associação)

E quais são as maneiras de escrever uma consulta LINQ ?

Podemos escrever a consulta LINQ de três maneiras diferentes :

  1. Sintaxe da consulta
  2. Sintaxe do método
  3. Sintaxe mista (consulta + método)

Nota: Do ponto de vista do desempenho, não existe diferença entre as três abordagens acima. Portanto, o que você precisa usar depende da sua preferência pessoal. O que você precisa ter em mente é que, por trás dos panos, as consultas LINQ gravadas usando a sintaxe da consulta são convertidas em suas expressões lambda antes de serem compiladas.

Sintaxe de consulta

É uma das maneiras mais fáceis de escrever consultas LINQ complexas em um formato fácil e legível.

A sintaxe para esse tipo de consulta é muito semelhante à Consulta SQL. Se você estiver familiarizado com as consultas SQL, será fácil escrever consultas LINQ usando esta sintaxe de consulta.

A sintaxe é fornecida abaixo.

Sintaxe de método

A sintaxe do método se torna mais popular hoje em dia para escrever consultas LINQ. Ele usa uma expressão lambda para definir a condição da consulta.

As sintaxes dos métodos são fáceis de escrever consultas simples para executar operações de leitura e gravação em uma fonte de dados específica. Porém, para consultas complexas, as sintaxes dos métodos são um pouco difíceis de escrever em comparação com a sintaxe da consulta.

Nessa abordagem, a consulta LINQ é gravada usando vários métodos, combinando-os com um ponto(.).

Sintaxe Mista

Essa é a combinação das sintaxe de Consulta e Metodo.

Vejamos agora um exemplo de como usar cada uma dessas sintaxes.

Vamos supor que temos uma lista de números inteiros e precisamos escrever consultas usando cada um das sintaxes descritas conforme os requisitos definidos abaixo:

  1. Sintaxe de Consulta - Retornar todos os números maiores que 5;
  2. Sintaxe de Método - Retornar todos os números maiores que 5;
  3. Sintaxe Mista - Retornar todos os números maiores que 5 e calcular a soma destes números;

Para isso vamos criar um projeto no Visual Studio 2019 Community usando uma aplicação do tipo Console (.NET Core):

Vamos implementar a criação de cada consulta na sua respectiva sintaxe:

        static void Main(string[] args)
        {
            //Data Source ou Fonte de dados
            List<int> numeros = new List<int>()
            {
                1, 2, 3, 4, 5, 6, 7, 8, 9, 10
            };
            //Consulta LINQ usando a sintaxe de Consulta
            var sintaxeConsulta = from n in numeros
                                               where n > 5
                                               select n;
            //Consulta LINQ usando a sintaxe de Método
            var sintaxeMetodo = numeros.Where(n => n > 5).ToList();
            //Consulta LINQ usando a sintaxe Mista
            var sintaxeMista = (from n in numeros
                                           where n > 5
                                          select n).Sum();
            //Execução
            foreach (var item in <consulta>)
            {
                Console.Write(item + " ");
            }
            Console.ReadKey();
        }
}

Temos assim as consultas LINQ definidas segundo as sintaxes existentes.

"Fui buscado dos que não perguntavam por mim, fui achado daqueles que não me buscavam; a uma nação que não se chamava do meu nome eu disse: Eis-me aqui. Eis-me aqui."
Isaías 65:1

Referências:

José Carlos Macoratti