Devo usar duas cláusulas “where” ou “&&” na minha consulta LINQ?

Ao escrever uma consulta LINQ com várias condições “e”, devo escrever uma única cláusula where contendo && ou várias cláusulas where , uma para cada condição?

 static void Main(string[] args) { var ints = new List(Enumerable.Range(-10, 20)); var positiveEvensA = from i in ints where (i > 0) && ((i % 2) == 0) select i; var positiveEvensB = from i in ints where i > 0 where (i % 2) == 0 select i; System.Diagnostics.Debug.Assert(positiveEvensA.Count() == positiveEvensB.Count()); } 

Existe alguma diferença além da preferência pessoal ou estilo de codificação (linhas longas, legibilidade, etc.) entre positiveEvensA e positiveEvensB ?

Uma diferença possível que vem à mente é que diferentes provedores LINQ podem lidar melhor com múltiplos s em vez de uma expressão mais complexa; isso é verdade?

Eu pessoalmente sempre usaria as cláusulas && vs. 2, sempre que isso não tornasse a declaração ininteligível.

No seu caso, provavelmente não será noticeble, mas ter 2 cláusulas definitivamente terá um impacto no desempenho se você tiver uma coleção grande, e se você usar todos os resultados desta consulta. Por exemplo, se você chamar .Count () nos resultados ou percorrer a lista inteira, a primeira cláusula where será executada, criando um novo IEnumerable que será completamente enumerado novamente, com um segundo delegado.

Encadear as cláusulas 2 faz com que a consulta formem um único delegado que é executado à medida que a coleção é enumerada. Isso resulta em uma enumeração através da coleção e uma chamada para o delegado sempre que um resultado é retornado.

Se você dividir, as coisas mudam. Como sua primeira cláusula where é enumerada na coleção original, a segunda cláusula where indica seus resultados. Isto causa, potencialmente (pior caso), 2 enumerações completas através de sua coleção e 2 delegates chamados por membro, o que poderia significar que esta declaração (teoricamente) poderia levar 2x a velocidade de tempo de execução.

Se você decidir usar 2 cláusulas where, colocar a cláusula mais restritiva primeiro ajudará bastante, já que a segunda cláusula where é executada apenas nos elementos que passam no primeiro.

Agora, no seu caso, isso não importa. Em uma grande coleção, poderia. Como regra geral, eu vou para:

1) Legibilidade e facilidade de manutenção

2) desempenho

Nesse caso, acho que ambas as opções são igualmente fáceis de manter, então eu optaria pela opção com maior desempenho.

Isso é principalmente um problema de estilo pessoal. Pessoalmente, desde que a cláusula where se encaixe em uma linha, eu agrupo as cláusulas.

O uso de vários locais tenderá a ter um desempenho menor, pois requer uma chamada extra de delegado para cada elemento que o torna tão distante. No entanto, é provável que seja um problema insignificante e só deve ser considerado se um profiler mostrar que é um problema.

O problema de desempenho só se aplica a collections baseadas em memory … O Linq to SQL gera trees de expressão que adiam a execução. Mais detalhes aqui:

Múltiplas cláusulas WHERE com methods de extensão LINQ

Como outros sugeriram, é mais uma preferência pessoal. Eu gosto do uso de && como é mais legível e imita a syntax de outros idiomas tradicionais.