Я намагався зробити багато досліджень, але я більше хлопець, тому навіть пояснення в MSDN для мене не має ніякого сенсу. Хто-небудь може пояснити і навести кілька прикладів того, що Include()
робить твердження в терміні SQL
запиту?
Я намагався зробити багато досліджень, але я більше хлопець, тому навіть пояснення в MSDN для мене не має ніякого сенсу. Хто-небудь може пояснити і навести кілька прикладів того, що Include()
робить твердження в терміні SQL
запиту?
Відповіді:
Скажімо, наприклад, ви хочете отримати список усіх своїх клієнтів:
var customers = context.Customers.ToList();
І припустимо, що кожен Customer
об’єкт має посилання на свій набір Orders
, і що кожен Order
має посилання, на LineItems
які також може посилатися a Product
.
Як бачите, вибір об’єкта верхнього рівня із багатьма пов’язаними сутностями може призвести до запиту, який потребує отримання даних із багатьох джерел. Як показник продуктивності Include()
дозволяє вказати, які пов’язані об’єкти слід читати з бази даних як частину того самого запиту.
Використовуючи той самий приклад, це може принести всі відповідні заголовки замовлення, але жоден з інших записів:
var customersWithOrderDetail = context.Customers.Include("Orders").ToList();
На завершення після того, як ви попросили SQL, перший оператор без Include()
може створити просте твердження:
SELECT * FROM Customers;
Остаточне твердження, яке викликає, Include("Orders")
може виглядати так:
SELECT *
FROM Customers JOIN Orders ON Customers.Id = Orders.CustomerId;
LineItems
і Products
, запит LINQ повинен виглядати так var customersWithOrderDetail = context.Customers.Include("Orders").Include("LineItems").Include("Products").ToList();
:?
Include()
щоб захопити об’єкти за різницею «шляхів». Якщо ви хочете об'єкти в одному шляху, вам потрібно зробити лише один виклик, який визначає весь шлях. Оскільки LineItems
і Products
не діляться жодними компонентами шляху, вам потрібні окремі виклики.
Я просто хотів додати, що "Включити" є частиною нетерплячого завантаження. Це описано в підручнику Microsoft Entity Framework 6. Ось посилання: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data-with-the -entity-framework-in-an-asp-net-mvc-application
Витяг із пов’язаної сторінки:
Ось декілька способів, як Entity Framework може завантажувати пов’язані дані у властивості навігації сутності:
Ліниве завантаження. Коли об'єкт читається вперше, пов'язані дані не отримуються. Однак під час першої спроби отримати доступ до властивості навігації дані, необхідні для цього властивості навігації, автоматично отримуються. Це призводить до декількох запитів, надісланих до бази даних - по одному для самої сутності та по одному кожного разу, коли пов'язані дані для сутності повинні бути отримані. Клас DbContext за замовчуванням дозволяє поступове завантаження.
Прагне завантаження. Коли об’єкт читається, разом із ним отримуються відповідні дані. Зазвичай це призводить до одного запиту на приєднання, який отримує всі необхідні дані. Ви визначаєте нетерпляче завантаження за допомогою
Include
методу.Явне завантаження. Це схоже на ліниве завантаження, за винятком того, що ви явно отримуєте відповідні дані в коді; це не відбувається автоматично, коли ви отримуєте доступ до властивості навігації. Ви завантажуєте пов’язані дані вручну, отримуючи запис об’єкта диспетчера стану для сутності та викликаючи метод Collection.Load для колекцій або метод Reference.Load для властивостей, які містять одну сутність. (У наступному прикладі, якщо ви хочете завантажити властивість навігації адміністратора, ви заміните
Collection(x => x.Courses)
наReference(x => x.Administrator)
.) Зазвичай ви використовуєте явне завантаження лише тоді, коли ви вимкнули ліниве завантаження.Оскільки вони не відразу отримують значення властивостей, ліниве завантаження та явне завантаження також відомі як відкладене завантаження.
Подумайте про це як про примусове завантаження в сценарії, коли в під-елементах було б ліниве завантаження.
Надсилання запиту EF до бази даних спочатку дасть більший результат, але при доступі не буде зроблено подальших запитів при доступі до включених елементів.
З іншого боку, без цього EF виконував би окремі запити пізніше, коли ви вперше отримали доступ до підпунктів.