Cuida el rendimiento:
Experimenté que al menos con EF Core, las diferentes respuestas dadas aquí podrían dar como resultado un rendimiento diferente. Soy consciente de que el OP preguntó sobre Linq to SQL, pero me parece que las mismas preguntas también ocurren con EF Core.
En un caso específico que tuve que manejar, la sugerencia (sintácticamente más agradable) de Marc Gravell resultó en uniones izquierdas dentro de una aplicación cruzada, de manera similar a lo que describió Mike U, lo que resultó en que los costos estimados para esta consulta específica eran dos veces más alto en comparación con una consulta sin uniones cruzadas . Los tiempos de ejecución del servidor diferían en un factor de 3 . [1]
La solución de Marc Gravell resultó en una consulta sin combinaciones cruzadas.
Contexto: esencialmente necesitaba realizar dos uniones izquierdas en dos tablas, cada una de las cuales nuevamente requería una unión a otra tabla. Además, allí tuve que especificar otras condiciones where en las tablas en las que necesitaba aplicar la combinación izquierda. Además, tenía dos uniones internas en la mesa principal.
Costos estimados del operador:
- con aplicación cruzada: 0.2534
- sin aplicación cruzada: 0.0991.
Tiempos de ejecución del servidor en ms (consultas ejecutadas 10 veces; medido usando SET STATISTICS TIME ON):
- con aplicación cruzada: 5, 6, 6, 6, 6, 6, 6, 6, 6, 6
- sin aplicación cruzada: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
(La primera ejecución fue más lenta para ambas consultas; parece que algo está en caché).
Tamaños de mesa:
- tabla principal: 87 filas,
- primera tabla para la unión izquierda: 179 filas;
- segunda tabla para la unión izquierda: 7 filas.
Versión EF Core: 2.2.1.
Versión de SQL Server: MS SQL Server 2017-14 ... (en Windows 10).
Todas las tablas relevantes tenían índices solo en las claves primarias.
Mi conclusión: siempre se recomienda mirar el SQL generado, ya que realmente puede diferir.
[1] Curiosamente, al configurar las 'Estadísticas del cliente' en MS SQL Server Management Studio, pude ver una tendencia opuesta; a saber, que la última ejecución de la solución sin aplicación cruzada tomó más de 1 segundo. Supongo que algo iba mal aquí, tal vez con mi configuración.