left - LINQ se une a múltiples condiciones en cláusula On
left join linq (3)
Aquí tienes:
from b in _dbContext.Burden
join bl in _dbContext.BurdenLookups on
new { Organization_Type = b.Organization_Type_ID, Cost_Type = b.Cost_Type_ID } equals
new { Organization_Type = bl.Organization_Type_ID, Cost_Type = bl.Cost_Type_ID }
Estoy intentando implementar una consulta en LINQ que usa una combinación externa izquierda con múltiples condiciones en la cláusula ON.
Usaré el ejemplo de las siguientes dos tablas Project (ProjectID, ProjectName) y Task (TaskID, ProjectID, TaskName, Completed). Quiero ver la lista completa de todos los proyectos con sus respectivas tareas, pero solo aquellas tareas que se completan.
No puedo usar un filtro para Completed == true
porque eso filtrará cualquier proyecto que no tenga tareas completadas. En su lugar, deseo agregar Completed == true
a la cláusula ON de la unión para que se muestre la lista completa de proyectos, pero solo se mostrarán las tareas completadas. Los proyectos sin tareas completadas mostrarán una sola fila con un valor nulo para Tarea.
Aquí está la base de la consulta.
from t1 in Projects
join t2 in Tasks
on new { t1.ProjectID} equals new { t2.ProjectID } into j1
from j2 in j1.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }
¿Cómo agrego && t2.Completed == true
a la cláusula on?
Parece que no puedo encontrar ninguna documentación de LINQ sobre cómo hacer esto.
No puedes hacerlo así. La cláusula join
(y el método de extensión Join()
) solo admite equijoins. Esa es también la razón, por qué usa equals
y no ==
. E incluso si pudieras hacer algo así, no funcionaría, porque join
es una unión interna, no una unión externa.
Solo necesita nombrar la propiedad anónima igual en ambos lados
on new { t1.ProjectID, SecondProperty = true } equals
new { t2.ProjectID, SecondProperty = t2.Completed } into j1
En base a los comentarios de @svick, aquí hay otra implementación que podría tener más sentido:
from t1 in Projects
from t2 in Tasks.Where(x => t1.ProjectID == x.ProjectID && x.Completed == true)
.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }