2016-06-27 4 views
13

У меня есть три Модели, которые я хочу включить при выполнении запроса.Entity Framework Core Eager Loading Then Include on collection

Вот сценарий.

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

я могу нетерпеливые нагрузки на SaleNotes, как это ...

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

Однако, пытаясь нетерпеливой нагрузке модели пользователя от SaleNote использования ThenInclude является сложной задачей, потому что это коллекция. Я не могу найти примеры того, как можно загружать этот сценарий. Может ли кто-то поставить код, который отправляется в следующем ThenInclude, чтобы загрузить пользователя для каждого элемента в коллекции.

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

ответ

19

Это не важно, что SaleNotes является сбор навигационной собственности. Он должен работать так же ссылки и коллекции:

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

Но, насколько я знаю, EF7 также поддерживает старый многоуровневый Включить синтаксис с использованием метода выбора расширения:

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

Спасибо за ваш ответ. Я на самом деле обнаружил, что, хотя пользователь не появился в intellisense, я добавил sn.User, построил свое решение, и оно запустилось! Intellisense обрабатывал SaleNotes «sn» в выражении лямбда в виде коллекции, поэтому он не показывал индивидуальные свойства класса User. –

+0

добро пожаловать. Я рад, что смог помочь;) – octavioccl

+3

@AllenRufolo есть две перегрузки, одна из которых дает вам весь список (первый и по умолчанию один), другой, который дает вам каждый элемент в списке (второй) - так, если вы просто делаете «стрелку вниз» в intellisense, вы увидите ожидаемые варианты intellisense. У меня была такая же путаница :-) – gzak

2

Для справки, последняя релиз EF Core (1.1.0) также поддерживает явную загрузку для этого сценария. Что-то вроде этого ...

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(); 
} 
Смежные вопросы