Acredito que a maioria dos programadores já se perguntou qual é a melhor forma realizar consultas usando LINQ: Query Syntax ou Method Syntax?

Antes de tudo vale a pena falar que LINQ (Language Integrated Query) é uma linguagem de consulta integrada às linguagens .NET que permite e que o programador faça consultas utilizando objetos fortemente tipados. Quem já escreveu código com SQL embutido sabe muito bem o problema que é escrever um comando errado que só é descoberto durante a execução do sistema.

O LINQ permite escrevermos as consultas de duas maneiras distintas que são a Query Syntax que tem um formato muito parecido com comandos SQL e Method Syntax que se parece com a chamada de métodos encadeados.

string[] meses = {"jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez" };

// query syntax
var meses1 = 
  from mes 
  in meses 
  where mes.StartsWith("j") 
  select mes;

// method syntax
var meses2 = meses.Where(x => x.StartsWith("j"));

No exemplo anterior as duas formas são semanticamente equivalentes e produzem o mesmo resultado, porém a query syntax tem algumas limitações com agregações (Ex.: Count()) muito embora seja possível aplicar as agregações em cima de seus resultados.

// query syntax com Count()
(from cidade in Cidades select cidade).Count()

// method syntax com Count()
Cidades.Count()

Do ponto de vista da performance não há diferenças uma vez que ambas acabam compiladas como method expressions.

Já que não há diferenças significativas do ponto de vista técnico a escolha entre uma ou outra forma acaba sendo uma questão de preferência. Algumas pessoas preferem a query syntax por acharem que é mais simples e fácil de se ler enquanto outras preferem a method syntax por ser mais parecida com a “programação pura”.

Tenho preferência pelo method syntax, mas quando há a necessidade de joins prefiro usar query syntax que fica mais legível (veja exemplo abaixo).

// query syntax
from cidade in Cidades 
join uf in Ufs on cidade.IdUf equals uf.IdUf
select new { cidade.NomeCidade, uf.SiglaUf }

// method syntax
Cidades
   .Join (
      Ufs, 
      cidade => cidade.IdUf, 
      uf => uf.IdUf, 
      (cidade, uf) => 
         new  
         {
            NomeCidade = cidade.NomeCidade, 
            SiglaUf = uf.SiglaUf
         }
   )

Note que minha “preferência” de escolha acaba tendo como critério a legibilidade do código, afinal de contas outros programadores também darão manutenção nesse código. Inclusive recomendo que, sempre que possível, o desenvolvedor deverá optar pela clareza e legibilidade do código.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *