2009-06-03 33 views
9

Assumere il seguente gerarchia:Entity Framework: Eredità e Includi

class Department { EntityCollection<Employee> Employees; } 

class Employee { string Name; } 

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

Quindi, reparto contiene un elenco dei dipendenti. Esiste una gerarchia di tipi di dipendenti, alcuni tipi fanno riferimento ad altre entità. Supponiamo di dover caricare il reparto con i suoi dipendenti. OK, non un problema:

dataContext.Departments.Include("Employees") 

Questo restituisce tipi di dipendenti concreti (cioè RemoteEmployee per quelli remoti). Ora dobbiamo caricare la posizione con dipendenti remoti.

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 

Cosa devo specificare in Includi per caricare la posizione con RemoteEmployee?

+1

Cosa c'è di sbagliato con la soluzione di Alex. Perché non lo accetti in modo che possa ottenere una ricompensa? – VdesmedT

risposta

13

Sono abbastanza sicuro di ciò che CatZ suggerisce non funziona.

non credo che si può fare questo usando comprendono, ma si può ottenere lo stesso effetto con un trucco di proiezione vedere questo How to Sort Relationships in the Entity Framework

Quello che dovete fare è qualcosa di simile:

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); 
} 

Si noti che non è necessario utilizzare i tipi anonimi per ottenere i dati, essenzialmente la proiezione ha un effetto collaterale del riempimento delle raccolte sul proprio dipartimento a causa di una funzionalità di Entity Framework denominata correzione.

Spero che questo aiuti Alex

+1

Grazie, questo aiuta. Non posso dire di essere felice con questa soluzione. Ora ho appena caricato manualmente le proprietà richieste utilizzando questo: department.Employees.OfType .ForEach (re => re.LocationReference.Load()); Sembra più leggibile ma al costo della velocità. –

+0

Sto cercando di implementare la soluzione di cui sopra, ma nell'esempio sopra dove si ha 'd.Employees.Select (' la mia proprietà di navigazione non è una collezione a causa della molteplicità, quindi non ha un metodo Select (se lo fa era invece un singolo impiegato come 'd.Employee' e volevo controllare e vedere se Employee era un certo tipo derivato, e in questo caso caricare le sue proprietà di navigazione. – AaronLS

Problemi correlati