Actualmente estoy restringido a usar métodos de extensión en un repositorio de datos EF4; No puedo usar linq para EF. Estoy tratando de hacer un simple trabajo de combinación de 3 tablas. Aquí está el código:¿Qué pasa con esta llamada al método EF Join?
var query = _readOnlyRepository.All<Parent>()
.Where(p => p.Something == "something")
.Join(_readOnlyRepository.All<Child>(), // Child entity
p => p.ParentID, // Parent Key
c => c.ChildId, // Child Key
(p, c) => c) // Projection
.Join(_readOnlyRepository.All<GrandChild>(),
c => m.ChildID,
g => g.GrandChildID,
(c, g) => g)
.Select(joined => joined.Child.Whatever);
aquí es (esencialmente) el SQL generado:
select c2.Whatever
from Parent p
inner join Child c on p.ParentId = c.ParentId
inner join GrandChild g on c.ChildId = g.ChildId
left outer join Child c2 on g.ChildId = c2.ChildId
where ("something" = p.Something)
¿Qué puedo cambiar en el código para eliminar esa combinación externa izquierda que invalida la intención de la consulta?
Bueno, según tengo entendido, "unido" es el objeto principal junto con los hijos unidos; el resultado de la primera llamada a All() después de filtrar a través de Where(). Es por eso que me he unido. Niño. Lo que sea. Intellisense está de acuerdo; tiene propiedades principales, no propiedades de GrandChild. – dudeNumber4
Estaba pensando que el resultado final era el objeto principal, no el resultado de la última unión. Estaba accediendo a unirse. Pensamiento de un niño que iba a ser padre -> hijo, pero esa propiedad era en realidad lo contrario: nieto -> hijo. La solución era cambiar (c, g) => g por (c, g) => c para devolver al niño no al nieto. – dudeNumber4