¿Es esta consulta equivalente a una LEFT OUTER
unión?
//assuming that I have a parameter named 'invoiceId' of type int
from c in SupportCases
let invoice = c.Invoices.FirstOrDefault(i=> i.Id == invoiceId)
where (invoiceId == 0 || invoice != null)
select new
{
Id = c.Id
, InvoiceId = invoice == null ? 0 : invoice.Id
}
.net
database
linq
linq-to-sql
Ali Kazmi
fuente
fuente
No necesita las declaraciones into:
Y sí, la consulta anterior crea una unión EXTERIOR IZQUIERDA.
Enlace a una pregunta similar que maneja múltiples combinaciones izquierdas: Linq to Sql: Varias combinaciones externas izquierdas
fuente
Verifique http://msdn.microsoft.com/en-us/vbasic/bb737929.aspx
fuente
Encontré 1 solución. si desea traducir este tipo de SQL (combinación izquierda) en la entidad Linq ...
SQL:
LINQ:
fuente
DefaultIfEmpty
.Me gustaría agregar una cosa más. En LINQ to SQL, si su base de datos está construida correctamente y sus tablas están relacionadas a través de restricciones de clave externa, entonces no necesita hacer una unión.
Usando LINQPad creé la siguiente consulta LINQ:
Que se tradujo a la consulta (ligeramente truncada) a continuación
Observe lo
LEFT OUTER JOIN
anterior.fuente
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:
Tiempos de ejecución del servidor en ms (consultas ejecutadas 10 veces; medido usando SET STATISTICS TIME ON):
(La primera ejecución fue más lenta para ambas consultas; parece que algo está en caché).
Tamaños de mesa:
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.
fuente