2009-04-15 8 views
0

Alors j'essaie de travailler sur un exemple d'application. Essayer de creuser dans ADO.NET Entity Framework. J'obtenir un employé de retour en utilisant une méthode avec LINQ comme ceci:ADO.NET Entity Framework, Northwind et Employee.Orders> 0

public IList<Employee> FindByLastName(string lastName) 
    { 
     IList<Employee> emps; 
     var e = from emp in _ctx.Employees where emp.LastName == lastName select emp; 
      emps = e.ToList<Employee>(); 
     return emps; 
    } 

Puis, dans un de mes tests unitaires J'ai emps [0] .Orders.Count> 0 et cela revient faux. Donc ma propriété Orders ne se charge pas. Qu'est-ce que je fais mal?

MISE À JOUR:
Toute réflexion sur la façon dont vous intégrer dans cette charge()/Inclure des choses dans un modèle référentiel?

Dois-je faire quelque chose boiteux comme

public IList<Employee> GetEmployeeById(int id, bool includeOrders) 
{ 

} 
+0

Je ne pense pas qu'il existe une meilleure façon générique de faire cela, plutôt que d'inclure des commandes, je retournerais peut-être des listes paresseuses, des listes qui, lorsqu'elles seront utilisées pour la première fois. – meandmycode

+0

Ok ... J'ai vu quelqu'un parler de listes paresseuses sur un blog. Je suppose que je devrais hériter de l'employé pour remplacer la liste simple par un paresseux. – BuddyJoe

+0

Vous aurez probablement besoin d'avoir une classe Employee qui n'est pas associée à la classe Employee définie par entity framework, puis de les mapper dans votre référentiel. Vous devrez également vous soucier de faire des changements à la liste des modèles, et comment ces changements sont restés à la repo .. – meandmycode

Répondre

2

Utilisez la méthode Include, et vous pouvez mieux écrire la requête moins LINQ comme:

public IList<Employee> FindByLastName(string lastName)  
{ 
    return _ctx.Employees 
     .Include("Orders") 
     .Where(emp => emp.LastName == lastName) 
     .ToList(); 
} 
1

Vous avez également la possibilité d'utiliser une instruction Include pour charger vos commandes.

public IList<Employee> FindByLastName(string lastName) 
{ 
    IList<Employee> emps; 
    var e = from emp in _ctx.Employees.Include("Orders") where emp.LastName == lastName select emp; 
     emps = e.ToList<Employee>(); 
    return emps; 
} 

Cela se traduira par un plus complexe se joindre au côté SQL, mais il a l'avantage d'un seul voyage à la base de données et une plus petite portée des dossiers que l'exemple Load() retournerait. Je les essayerais tous les deux et je verrais ce qui fonctionne le mieux pour vous.