2009-04-15 2 views
0

Also ich versuche, an einer Beispielanwendung zu arbeiten. Versuchen, in ADO.NET Entity Framework zu graben. Ich bekomme einen Mitarbeiter wie dies mit einem Verfahren mit LINQ zurück:ADO.NET Entity Framework, Northwind und 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; 
    } 

Dann in einen meiner Unit-Tests Ich habe emps [0] .Orders.Count> 0 und das kommt wieder falsch. So wird meine Orders-Eigenschaft nicht geladen. Was mache ich falsch?

UPDATE:
Irgendwelche Gedanken darüber, wie Sie diese in diese Last übernehmen()/Include Sachen in ein Repository-Muster?

Muss ich lahm etwas wie

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

} 
+0

Ich glaube nicht, dass theres eine generische beste Möglichkeit ist, dies zu tun, anstatt Include-Befehle zu sagen, würde ich vielleicht faule Listen, Listen zurückgeben, die bei der ersten Verwendung die Load-Methode zuerst aufrufen. – meandmycode

+0

Ok ... Ich habe jemanden gesehen, der über faule Listen in einem Blogpost gesprochen hat. Ich glaube, ich muss von Employee erben, um die einfache Liste durch eine faule zu ersetzen. – BuddyJoe

+0

Sie müssen wahrscheinlich eine Employee-Klasse verwenden, die nicht mit der durch das Entitätsframework definierten Employee-Klasse verknüpft ist, und diese dann in Ihrem Repository zuordnen. Sie müssen auch sorgen, um Änderungen an der Liste der Modelle vorzunehmen, und wie diese Änderungen beibehalten werden, zurück in den Repo .. – meandmycode

Antwort

2

Verwenden Sie die Include Methode zu tun, und Sie können besser sein, die Abfrage weniger Linq wie das Schreiben:

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

Sie haben auch die Möglichkeit der Verwendung von eine Include-Anweisung, um Ihre Bestellungen zu laden.

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

Dies in einer komplexeren an der SQL-Seite beitreten führen, aber es hat den Vorteil einer einzigen Reise in die Datenbank und einen kleineren Umfang der Datensätze als die Load() Beispiel zurückkehren würde. Ich würde sie beide ausprobieren und sehen, was am besten für dich funktioniert.