2015-09-02 16 views
5

Attualmente sto utilizzando EF e ho due tabelle, Employees e Orders, dato che uno Employee ha più Orders.Come eseguire una inclusione condizionale in Entity Framework

Ho bisogno di eseguire una query in EF che mi porta un elenco di tutti Employees con i relativi Orders, ma solo quelli tra due date. Se lo Employee non ha eseguito alcun Order nel periodo indicato, il suo elenco Orders sarà vuoto.

Ho pensato che ho bisogno di avviare la mia domanda dal DbSet Employees, ma come posso assegnare una condizione alla proprietà Orders?

Ho provato a farlo, ma ovviamente non ha funzionato.

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

Qualsiasi aiuto? Immagino che potrei perdere qualcosa di molto semplice qui.

+0

possibile duplicato del [Entity Framework .Dove annidato in .include] (http://stackoverflow.com/questions/18709386/entity-framework-where-nested-in-include) – DavidG

+1

usa left outer join.refer a questo link: http: //stackoverflow.com/questions/3404975/left-outer-join-in-linq – Arash

risposta

2

Non è possibile utilizzare un predicato Where in Includi, ma è possibile semplificare la query se si avvia da ordini.

Se si pensa nuovamente a ciò che è necessario interrogare, gli ordini non sono Dipendenti.

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

Questo quasi risolverebbe il mio problema, ma Intendo ripetere il DbSet 'Employee'. Usando la tua risposta, non sarei in grado di recuperare un Dipendente senza Ordini. Grazie per l'aiuto :) –

1

provare a sostituire

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

da:

myQuery.Load(); 
myQuery.SelectMany(x=>x.y).Where(....).Load(); 
Problemi correlati