Estoy tratando de 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 Proyecto (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 completaron.
No puedo usar un filtro para Completed == true
porque eso filtrará cualquier proyecto que no tenga tareas completadas. En su lugar, quiero agregar Completed == true
a la cláusula ON de la combinació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 Task.
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 LINQ sobre cómo hacer esto.
Respuestas:
Solo necesita nombrar la propiedad anónima de la misma manera en ambos lados
Según los comentarios de @svick, aquí hay otra implementación que podría tener más sentido:
fuente
and
, no como una igualdad de algún objeto "extraño". Y para probar mi punto, su código es incorrecto. Para que funcione, deberías tenertrue
en el lado izquierdo yt2.Complete
en el derecho.AND SecondProperty IN (123, 456)
. Continuaré con ese desafío y cualquier ayuda que pueda brindar será muy apreciada.Aquí tienes:
fuente
No puedes hacerlo así. La
join
cláusula (y elJoin()
método de extensión) solo admite equijoins. Esa es también la razón por la que se usaequals
y no==
. E incluso si pudiera hacer algo así, no funcionaría, porquejoin
es una combinación interna, no externa.fuente
Esto funciona bien para 2 mesas. Tengo 3 tablas y la cláusula on tiene que vincular 2 condiciones de 3 tablas. Mi código:
de p en _dbContext.Products une pv en _dbContext.ProductVariants en p.ProduktId es igual a pv.ProduktId une jpr en leftJoinQuery en el nuevo {VariantId = pv.Vid, ProductId = p.ProduktId} es igual a nuevo {VariantId = jpr.Prices.VariantId ProductId = jpr.Prices.ProduktID} en lj
Pero muestra un error en este punto: únase pv en _dbContext.ProductVariants en p.ProduktId es igual a pv.ProduktId
Error: el tipo de una de las expresiones en la cláusula de unión es incorrecto. Error de inferencia de tipo en la llamada a 'GroupJoin'.
fuente