2011-01-03 10 views
6

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?

Respuesta

2

No tengo claro qué es exactamente lo que está intentando devolver: ¿la propiedad del GrandChild? La segunda combinación devuelve el objeto nieto (c, g) => g así que creo que sólo necesitaría

.Select(joined => joined.Whatever); 

porque aquí joined es el objeto nieto.

+0

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

+0

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

Cuestiones relacionadas