3 ответов:
скажем, например вы хотите получить список всех ваших клиентов:
var customers = context.Customers.ToList();а давайте предположим, что каждый
Customerобъект имеет ссылку на свой наборOrders, и что каждыйOrderесть ссылки наLineItemsчто также может ссылаться на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;
Я просто хотел добавить, что" включить " является частью нетерпеливой загрузки. Это описано в учебнике Entity Framework 6 от Microsoft. Вот ссылка: 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 включает функцию lazy загрузка по умолчанию.
предвыборка. при чтении сущности вместе с ней извлекаются связанные данные. Это обычно приводит к одному запросу соединения, который извлекает все необходимые данные. Вы указываете нетерпеливую загрузку с помощью
Includeметод.явная загрузка. это похоже на ленивую загрузку, за исключением того, что вы явно извлекаете связанные данные в коде; это не происходит автоматически, когда вы доступ к свойству навигации. Связанные данные загружаются вручную путем получения записи диспетчера состояния объекта для сущности и вызова коллекции.Загрузите метод для коллекций или ссылки.Метод Load для свойств, содержащих одну сущность. (В следующем примере, если вы хотите загрузить свойство навигации администратора, вы должны заменить
Collection(x => x.Courses)СReference(x => x.Administrator).) Обычно вы используете явную загрузку только тогда, когда вы отключили ленивую загрузку.потому что они не немедленное получение значений свойств, отложенная загрузка и явная загрузка также известны как отложенная загрузка.
подумайте об этом как о принудительной загрузке в сценарии, где вы подэлементы в противном случае были бы ленивой загрузкой.
запрос EF, отправленный в базу данных, сначала даст больший результат, но при доступе к включенным элементам последующие запросы не будут выполняться.
с другой стороны, без него EF выполнит запросы separte позже, когда вы впервые получите доступ к подпунктам.
Comments