Что делает Include () в LINQ?



Я пытался сделать много исследований, но я больше из db парень - так что даже объяснение в MSDN не имеет никакого смысла для меня. Может ли кто-нибудь объяснить, и привести некоторые примеры того, что Include() заявление в срок SQL запрос?

1352   3  

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

    Ничего не найдено.