2015-09-02 9 views
5

Ich verwende derzeit EF und ich habe zwei Tabellen, Employees und Orders, vorausgesetzt, dass ein Employee mehrere Orders haben.Wie führe ich ein bedingtes Include in Entity Framework durch?

Ich brauche eine Abfrage in EF, die mir eine Liste aller Employees mit ihren verwandten Orders bringt, aber nur diejenigen zwischen zwei Daten. Wenn ein Employee in dem angegebenen Zeitraum keinen Order ausführt, ist seine Orders Liste leer.

Ich dachte, dass ich meine Abfrage von der Employees DbSet starten muss, aber wie kann ich der Orders Eigenschaft eine Bedingung zuweisen?

Ich habe versucht, dies zu tun, aber offensichtlich hat es nicht funktioniert.

public List<Employee> GetAllByIdListAndDateRange(int[] ids, DateTime fromDate, DateTime toDate) 
    { 
     var query = _context.Set<Employee>().Where(a => ids.Contains(a.EmployeeID)).Include(a => a.Orders.Where(o.OrderDate <= toDate && o.OrderDate >= fromDate)); 

     return query.ToList(); 
    } 

Irgendwelche Hilfe? Ich schätze, ich verpasse hier etwas wirklich Einfaches.

+0

möglich Duplikat [Entity Framework .Where in .INCLUDE verschachtelt] (http://stackoverflow.com/questions/18709386/entity-framework-where-verschachtelt-in-include) – DavidG

+1

Verwenden Sie den linken äußeren join.refer zu diesem Link: http: //stackoverflow.com/questions/3404975/left-outer-join-in-lin – Arash

Antwort

2

Sie können kein Where-Prädikat in Include verwenden, aber Sie können Ihre Abfrage vereinfachen, wenn Sie von Orders ausgehen.

Wenn Sie es wieder denken, was Sie abfragen müssen, ist Bestellungen nicht Mitarbeiter.

var query = _context.Set<Orders>() 
        .Where(o => o.OrderDate <= toDate && 
           o.OrderDate >= fromDate && 
           ids.Contains(o.EmployeeID)) 
        .Include(e => e.Employee)); 
+1

Dies würde fast lösen mein Problem, aber Ich beabsichtige, das "Employee" DbSet zu durchlaufen. Mit Ihrer Antwort konnte ich keinen Angestellten abrufen, der keine Aufträge hatte. Danke für Ihre Hilfe :) –

1

try

myQuery.Include(x=>x.Y).Load(); 

durch ersetzen:

myQuery.Load(); 
myQuery.SelectMany(x=>x.y).Where(....).Load(); 
Verwandte Themen