Запрос с включениями возвращает один набор результатов, а количество включений влияет на то, как большой набор данных передается с сервера базы данных на веб-сервер.Пример:
Предположим, у нас есть сущность Customer (Id, Name, Address)
и сущность Order (Id, CustomerId, Date)
.Теперь мы хотим запросить у клиента его заказы:
var customer = context.Customers
.Include("Orders")
.SingleOrDefault(c => c.Id == 1);
Полученный набор данных будет иметь следующую структуру:
Id | Name | Address | OrderId | CustomerId | Date
---------------------------------------------------
1 | A | XYZ | 1 | 1 | 1.1.
1 | A | XYZ | 2 | 1 | 2.1.
Это означает, что данные Cutomers
повторяются для каждогоOrder
.Теперь давайте расширим пример с другими сущностями - 'OrderLine (Id, OrderId, ProductId, Количество) and
Product (Id, Name) `.Теперь мы хотим запросить у клиента его заказы, строки заказа и продукты:
var customer = context.Customers
.Include("Orders.OrderLines.Product")
.SingleOrDefault(c => c.Id == 1);
Полученный набор данных будет иметь следующую структуру:
Id | Name | Address | OrderId | CustomerId | Date | OrderLineId | LOrderId | LProductId | Quantity | ProductId | ProductName
------------------------------------------------------------------------------------------------------------------------------
1 | A | XYZ | 1 | 1 | 1.1. | 1 | 1 | 1 | 5 | 1 | AA
1 | A | XYZ | 1 | 1 | 1.1. | 2 | 1 | 2 | 2 | 2 | BB
1 | A | XYZ | 2 | 1 | 2.1. | 3 | 2 | 1 | 4 | 1 | AA
1 | A | XYZ | 2 | 1 | 2.1. | 4 | 2 | 3 | 6 | 3 | CC
Как вы можете видеть, данные становятсядовольно много дублируется.Как правило, каждое включение в свойство ссылочной навигации (Product
в примере) добавляет новые столбцы, а каждое включение в свойство навигации коллекции (Orders
и OrderLines
в примере) добавляет новые столбцы и дублирует уже созданные строки длякаждая строка во включенной коллекции.
Это означает, что ваш пример может легко содержать сотни столбцов и тысячи строк, что является большим количеством данных для передачи.Правильный подход - это создание тестов производительности, и если результат не будет соответствовать вашим ожиданиям, вы можете изменить свой запрос и загрузить свойства навигации отдельно по их собственным запросам или по методу LoadProperty
.
Пример отдельных запросов:
var customer = context.Customers
.Include("Orders")
.SingleOrDefault(c => c.Id == 1);
var orderLines = context.OrderLines
.Include("Product")
.Where(l => l.Order.Customer.Id == 1)
.ToList();
Пример LoadProperty
:
var customer = context.Customers
.SingleOrDefault(c => c.Id == 1);
context.LoadProperty(customer, c => c.Orders);
Также вы всегда должны загружать только те данные, которые вам действительно нужны.
Редактировать: Я простосоздано предложение для Data UserVoice для поддержки дополнительной стратегии активной загрузки, в которой загруженные данные будут передаваться в дополнительном наборе результатов (создается отдельным запросом в рамках одного и того же обращения к базе данных).Если вы находите это улучшение интересным, не забудьте проголосовать за предложение.