Как я с нетерпением включаю элементы дочернего элемента и внука в Entity Framework Code First?

Представьте себе три сущности (Customer, Book, Author), связанные с этим:

У Клиента много книг

В книге есть один автор

Я использую эти данные для печати отчета следующим образом:

Customer: Peter
  Book: To Kill a Mockingbird - Author: Harper Lee
  Book: A Tale of Two Cities - Author: Charles Dickens
Customer: Melanie
  Book: The Hobbit - Author: J. R. R. Tolkien

Когда я запрашиваю для Клиентов, я получаю, как и ожидалось, кучу запросов следующего характера

  • Запрос на получение клиентов
  • Запрос на клиента для получения его книг
  • Запрос на книгу, чтобы получить ее автора

Я могу уменьшить количество запросов, включив такие книги:

var customers = db.Customers.Include(c = > c.Books);

Но я не знаю, как загрузить третий уровень (Автор). Как я могу это сделать?

Ответ 1

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

var customers = db.Customers.Include("Books.Author");

Это выглядит странно, потому что "Автор" не является свойством в коллекции книг (скорее, свойство в каждой отдельной книге), но оно работает. Дайте ему вихрь.

Ответ 2

Кроме того, нет необходимости использовать перегрузку строки. Этот метод также будет работать:

var customers = db.Customers.Include(c => c.Books.Select(b => b.Author));

Дополнительные примеры см. в блоге блога EF: http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

И этот учебник: http://www.asp.net/entity-framework/tutorials/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

Ответ 3

Вы можете использовать ключевое слово ThenInclude:

var customers = db.Customers.Include(c => c.Books).ThenInclude(book => book.Author));}