2009-06-03 40 views
9

Supongamos la siguiente jerarquía:Entity Framework: Herencia y Incluir

class Department { EntityCollection<Employee> Employees; } 

class Employee { string Name; } 

class RemoteEmployee : Employee { Country Location; EntityReference<Country> CountryReference; } 

Así, departamento contiene una lista de los empleados. Hay una jerarquía de tipos de empleados, algunos tipos hacen referencia a otras entidades. Supongamos que tenemos que cargar departamento con sus empleados. OK, no es un problema:

dataContext.Departments.Include("Employees") 

Esto devuelve tipos concretos de los empleados (es decir RemoteEmployee para los más remotos). Ahora tenemos que cargar la ubicación con los empleados remotos.

dataContext.Departments.Include("Employees").Include("Employees.Location") - Error: no such property in Employee 
dataContext.Departments.Include("Employees").Include("RemoteEmployees.Location") - Error: no such property in Department 

¿Qué debo especificar en Incluir para cargar la ubicación con RemoteEmployee?

+1

¿Qué pasa con solución de Alex. ¿Por qué no lo aceptas para que pueda obtener una recompensa de eso? – VdesmedT

Respuesta

13

Estoy bastante seguro de que lo que CatZ sugiere no funciona.

no creo que usted puede hacer esto usando incluyen, pero se puede lograr el mismo efecto usando un truco de proyección ver este How to Sort Relationships in the Entity Framework

Lo que hay que hacer es algo como esto:

var results = from d in ctx.Departments 
       select new { 
        d, 
        employees = d.Employees.Select(
         e => new { 
          e, 
          location = e is RemoteEmployee ? 
            (e as RemoteEmployee).Location : 
            null 
        } 
        ) 
       }; 


foreach (var result in results) 
{ 
    var re = result.d.Employees.First() as RemoteEmployee; 
    Console.WriteLine("{0} {1} works from {2}", 
      re.Firstname, re.Surname, re.Location.Name); 
} 

Tenga en cuenta que no necesita usar los tipos anónimos para obtener los datos, básicamente, hacer que la proyección tenga un efecto secundario al completar las colecciones en su departamento debido a una característica de Entity Framework llamada fixup.

Esperanza esto ayuda Alex

+1

Gracias, eso ayuda. No puedo decir que estoy contento con esta solución. Ahora solo cargué manualmente las propiedades requeridas usando esto: department.Employees.OfType .ForEach (re => re.LocationReference.Load()); Parece más legible pero a un costo de velocidad. –

+0

Estoy tratando de implementar la solución anterior, pero en el ejemplo anterior donde tienes 'd.Employees.Select (' mi propiedad de navegación no es una colección debido a la multiplicidad, por lo que no tiene un método Select (si es En cambio, era un solo empleado como 'd.Employee' y quería verificar si el empleado era de cierto tipo derivado y, de ser así, cargar sus propiedades de navegación. – AaronLS