2016-06-27 91 views
13

Ho tre modelli che desidero includere durante l'esecuzione di una query.Entity Framework Core Eager Loading Then Includi in una raccolta

Ecco lo scenario.

public class Sale 
{ 
    public int Id { get; set; } 
    public List<SaleNote> SaleNotes { get; set; } 
} 

public class SaleNote 
{ 
    public int Id { get; set; } 
    public User User { get; set; } 
} 

public class User 
{ 
    public int Id { get; set; } 
} 

posso caricare i ansioso SaleNotes come questo ...

_dbContext.Sale.Include(s => s.SaleNotes); 

Tuttavia, cercando di carico ansiosi il modello utente dal SaleNote utilizzando ThenInclude è impegnativo, perché si tratta di una collezione. Non riesco a trovare alcun esempio su come caricare avidamente questo scenario. Qualcuno può fornire il codice che va nel seguente ThenInclude per caricare l'utente per ogni elemento della collezione.

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(...); 

risposta

19

Non importa che SaleNotes è proprietà di navigazione di raccolta. Dovrebbe funzionare lo stesso per i riferimenti e le collezioni:

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(sn=>sn.User); 

ma per quanto ne so, EF7 supporta anche il vecchio multi-livello includono la sintassi utilizzando Seleziona metodo di estensione:

_dbContext.Sale.Include(s => s.SaleNotes.Select(sn=>sn.User)); 
+13

Grazie per la risposta. In realtà ho scoperto che sebbene l'Utente non si fosse mostrato nell'intelligenza, ho aggiunto sn.User, ho costruito la mia soluzione e funzionava! L'intellisense trattava la "sn" di SaleNotes nell'espressione lambda come una raccolta, quindi non mostrava le proprietà individuali della classe User. –

+0

prego. Sono felice di poterti aiutare;) – octavioccl

+3

@AllenRufolo ci sono due overload, uno che ti dà l'intera lista (la prima e quella di default), un'altra che ti dà ogni elemento nella lista (la seconda) - quindi, se fai semplicemente "freccia giù" nell'intelligence, vedrai le opzioni intellettuali attese. Ho avuto la stessa confusione anche io :-) – gzak

2

Per riferimento, l'ultima la versione di EF Core (1.1.0) supporta anche il caricamento esplicito per questo scenario. Qualcosa del genere ...

using (var _dbContext = new DbContext()) 
{ 
    var sale = _dbcontext.Sale 
     .Single(s => s.Id == 1); 

    _dbcontext.Entry(sale) 
     .Collection(n => n.SalesNotes) 
     .Load(); 

    _dbcontext.Entry(sale) 
     .Reference(u => u.User) 
     .Load(); 
}