2009-06-03 11 views
9

On suppose la hiérarchie suivante:Entity Framework: Héritage et Inclure

class Department { EntityCollection<Employee> Employees; } 

class Employee { string Name; } 

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

Ainsi, le département contient une liste des employés. Il existe une hiérarchie des types d'employés, certains types référencent d'autres entités. Supposons que nous devions charger le département avec ses employés. OK, pas de problème:

dataContext.Departments.Include("Employees") 

Cela renvoie les types d'employés en béton (à savoir RemoteEmployee pour les distants). Maintenant, nous devons charger Location avec des employés distants. Que dois-je spécifier dans Include pour charger Location avec RemoteEmployee?

+1

Quel est le problème avec la solution ALEX. Pourquoi ne l'acceptez-vous pas pour qu'il puisse en être récompensé? – VdesmedT

Répondre

13

Je suis assez sûr que ce que suggère CatZ ne fonctionne pas.

Je ne pense pas que vous pouvez le faire en utilisant Inclure, mais vous pouvez obtenir le même effet en utilisant une astuce de projection voir cette How to Sort Relationships in the Entity Framework

Ce que vous devez faire est quelque chose comme ceci:

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

Notez que vous n'avez pas besoin d'utiliser les types anonymes pour obtenir les données, essentiellement effectuer la projection a un effet secondaire de remplir les collections sur votre département en raison d'une fonctionnalité de l'Entity Framework appelée correctif.

Hope this helps Alex

+1

Merci, ça aide. Je ne peux pas dire que je suis content de cette solution. Maintenant, je charge simplement les propriétés requises en utilisant ceci: department.Employees.OfType .ForEach (re => re.LocationReference.Load()); Il semble que ce soit plus lisible mais au coût de la vitesse. –

+0

J'essaye d'implémenter la solution ci-dessus, mais dans l'exemple ci-dessus où vous avez 'd.Employees.Select (' ma propriété de navigation n'est pas une collection en raison de la multiplicité, donc elle n'a pas une méthode Select (si elle était à la place un seul employé comme 'd.Employee' et je voulais vérifier et voir si Employee était un certain type dérivé, et si oui alors charger ses propriétés de navigation. – AaronLS