Я попытался провести много исследований, но я больше люблю db - поэтому даже объяснение в MSDN не имеет для меня никакого смысла. Может ли кто-нибудь объяснить и предоставить несколько примеров того, что Include()
утверждение делает в термине SQL
запроса?
96
Ответы:
Допустим, вы хотите получить список всех своих клиентов:
И давайте предположим, что каждый
Customer
объект имеет ссылку на свой наборOrders
, и что у каждогоOrder
есть ссылки,LineItems
которые также могут ссылаться на файлProduct
.Как видите, выбор объекта верхнего уровня со многими связанными сущностями может привести к запросу, который должен получать данные из многих источников. В качестве показателя производительности
Include()
позволяет указать, какие связанные сущности должны быть прочитаны из базы данных в рамках одного запроса.Используя тот же пример, это может привести к появлению всех связанных заголовков заказов, но ни одной из других записей:
В качестве последнего момента, поскольку вы запросили 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
не разделяют, вам нужны отдельные вызовы.Я просто хотел добавить, что «Включить» - это часть активной загрузки. Он описан в руководстве по 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-в-asp-net-MVC-приложении
Выдержка со связанной страницы:
источник
Думайте об этом как о принудительной загрузке в сценарии, в котором ваши подпункты иначе загружались бы лениво.
EF запроса, отправляемый в базу данных, сначала даст больший результат, но при доступе никакие последующие запросы не будут выполняться при доступе к включенным элементам.
С другой стороны, без него EF будет выполнять отдельные запросы позже, когда вы впервые обращаетесь к подпунктам.
источник