sentencias left into inner hacer con clausula linq join

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 }