2016-06-27 3 views
13

Mam trzy modele, które chcę uwzględnić podczas wykonywania zapytania.Entity Framework Core Eager Ładowanie Następnie dołącz do kolekcji

Oto scenariusz.

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

mogę chętny Załaduj SaleNotes tak ...

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

Jednak starając się chętny obciążenia modelu użytkownika z wykorzystaniem ThenInclude SaleNote jest trudne, ponieważ jest zbiorem. Nie mogę znaleźć przykładów na to, jak szybko załadować ten scenariusz. Czy ktoś może podać kod, który należy wykonać w następnej funkcji Włącz, aby załadować użytkownika dla każdego elementu w kolekcji.

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

Odpowiedz

19

To nie ma znaczenia, że ​​SaleNotes jest własnością nawigacja kolekcja. Powinno to działać tak samo o referencje i kolekcjach:

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

ale o ile mi wiadomo, EF7 obsługuje również stary wielopoziomowe Dołącz składni przy użyciu Wybierz metodę rozszerzenia:

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

Dziękuję za odpowiedź. Faktycznie odkryłem, że chociaż użytkownik nie pojawił się w intellisense, dodałem sn.User, zbudowałem moje rozwiązanie i działało! Intellisense traktował "wymówkę" SaleNotes w wyrażeniu lambda jako kolekcję, więc nie pokazywał indywidualnych właściwości klasy User. –

+0

nie ma za co. Cieszę się, że mogłem pomóc;) – octavioccl

+3

@AllenRufolo są dwa przeciążenia, jeden który daje ci całą listę (pierwszą i domyślną), drugą, która daje ci każdy element na liście (drugi) - tak, jeśli po prostu wykonujesz "strzałkę w dół" w intellisense, zobaczysz oczekiwane opcje intellisense. Sam miałem takie samo zamieszanie :-) – gzak

2

Dla porównania, ostatni wydanie EF Core (1.1.0) obsługuje również jawne ładowanie dla tego scenariusza. Coś takiego ...

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