Как мне с энтузиазмом включить дочерний и внучатый элементы сущности в Entity Framework Code First? - PullRequest
60 голосов
/ 06 мая 2011

Представьте себе три сущности (Клиент, Книга, Автор), связанных так:

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

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

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

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

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

  1. Запрос для получения клиентов
  2. Запрос на одного Клиента, чтобы получить его Книги
  3. Запрос на Книгу, чтобы получить его автора

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

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

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

Ответы [ 3 ]

141 голосов
/ 07 мая 2011

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

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

48 голосов
/ 06 мая 2011

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

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

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

3 голосов
/ 31 января 2019

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

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

...