Как я с нетерпением включаю элементы дочернего элемента и внука в 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));}