Tengo el siguiente SQL, que estoy tratando de traducir a LINQ:
SELECT f.value
FROM period as p
LEFT OUTER JOIN facts AS f ON p.id = f.periodid AND f.otherid = 17
WHERE p.companyid = 100
He visto la implementación típica de la unión externa izquierda (es decir, into x from y in x.DefaultIfEmpty()
etc.) pero no estoy seguro de cómo introducir la otra condición de unión ( AND f.otherid = 17
)
EDITAR
¿Por qué la AND f.otherid = 17
condición es parte de JOIN en lugar de en la cláusula WHERE? Porque f
puede no existir para algunas filas y todavía quiero que se incluyan estas filas. Si la condición se aplica en la cláusula WHERE, después de JOIN, no obtengo el comportamiento que quiero.
Lamentablemente esto:
from p in context.Periods
join f in context.Facts on p.id equals f.periodid into fg
from fgi in fg.DefaultIfEmpty()
where p.companyid == 100 && fgi.otherid == 17
select f.value
parece ser equivalente a esto:
SELECT f.value
FROM period as p
LEFT OUTER JOIN facts AS f ON p.id = f.periodid
WHERE p.companyid = 100 AND f.otherid = 17
que no es exactamente lo que busco.
c#
sql
linq
linq-to-sql
outer-join
dan
fuente
fuente
Respuestas:
Debe introducir su condición de unión antes de llamar
DefaultIfEmpty()
. Simplemente usaría la sintaxis del método de extensión:O podría usar una subconsulta:
fuente
esto también funciona ... si tiene múltiples uniones de columna
fuente
Sé que es " un poco tarde ", pero en caso de que alguien necesite hacer esto en la sintaxis del método LINQ ( es por eso que encontré esta publicación inicialmente ), esta sería la forma de hacerlo:
fuente
.Select(fact.Value)
debería ser.Select(f => f.Value)
Otra opción válida es distribuir las uniones a través de múltiples cláusulas LINQ , de la siguiente manera:
fuente
Se puede escribir usando la clave de combinación compuesta. Además, si es necesario seleccionar propiedades de los lados izquierdo y derecho, LINQ se puede escribir como
fuente
Me parece que tiene valor considerar algunas reescrituras en su código SQL antes de intentar traducirlo.
Personalmente, escribiría una consulta como una unión (¡aunque evitaría los nulos por completo!):
Así que supongo que estoy de acuerdo con el espíritu de la respuesta de @ MAbraham1 (aunque su código parece no estar relacionado con la pregunta).
Sin embargo, parece que la consulta está diseñada expresamente para producir un resultado de columna única que comprende filas duplicadas, ¡de hecho nulos duplicados! Es difícil no llegar a la conclusión de que este enfoque es erróneo.
fuente