¿Debo usar dos cláusulas “where” o “&&” en mi consulta LINQ?

Al escribir una consulta LINQ con varias condiciones “y”, ¿debería escribir una sola cláusula where que contenga && o múltiples cláusulas where , una para cada condición?

 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()); } 

¿Hay alguna diferencia además de las preferencias personales o el estilo de encoding (líneas largas, legibilidad, etc.) entre positiveEvensA y positiveEvensB ?

Una posible diferencia que viene a la mente es que los diferentes proveedores de LINQ pueden ser capaces de lidiar mejor con múltiples where s en lugar de una expresión más compleja; ¿Es esto cierto?

Personalmente siempre iría con las cláusulas && vs. two where siempre que no haga que la statement sea ininteligible.

En su caso, probablemente no será notorio en absoluto, pero tener 2 cláusulas where definitivamente tendrá un impacto en el rendimiento si tiene una colección grande, y si usa todos los resultados de esta consulta. Por ejemplo, si llama a .Count () en los resultados, o itera a través de toda la lista, se ejecutará la primera cláusula where, creando un nuevo IEnumerable que será completamente enumerado nuevamente, con un segundo delegado.

Al unir las 2 cláusulas juntas, la consulta forma un único delegado que se ejecuta a medida que se enumera la colección. Esto da como resultado una enumeración a través de la colección y una llamada al delegado cada vez que se devuelve un resultado.

Si los divides, las cosas cambian. Como su cláusula first where enumera a través de la colección original, la cláusula second where enumera sus resultados. Esto provoca, potencialmente (el peor de los casos), 2 enumeraciones completas a través de su colección y 2 delegates llamados por miembro, lo que podría significar que esta afirmación (teóricamente) podría tomar 2 veces la velocidad del tiempo de ejecución.

Si decide usar las cláusulas 2 where, ubicar la cláusula más restrictiva primero ayudará bastante, ya que la cláusula second where solo se ejecuta en los elementos que pasan la primera.

Ahora, en tu caso, esto no importará. En una gran colección, podría. Como regla general, voy por:

1) Legibilidad y mantenimiento

2) Rendimiento

En este caso, creo que ambas opciones son igualmente mantenibles, así que optaría por la opción más eficiente.

Esto es principalmente un problema de estilo personal. Personalmente, siempre que la cláusula where encaje en una línea, agrupo las cláusulas.

Usar múltiples where’s tenderá a ser menos eficiente porque requiere una invocación de delegado adicional para cada elemento que llega tan lejos. Sin embargo, es probable que sea un problema insignificante y solo debe considerarse si un generador de perfiles lo muestra como un problema.

El problema de rendimiento solo se aplica a las colecciones basadas en memoria … Linq a SQL genera árboles de expresiones que difieren la ejecución. Más detalles aquí:

Múltiples cláusulas WHERE con métodos de extensión LINQ

Como otros han sugerido, es más una preferencia personal. Me gusta el uso de && ya que es más legible e imita la syntax de otros lenguajes principales.