Ответ 1
Запрос с включением возвращает единый результирующий набор, а количество включений влияет на то, как большой набор данных передается с сервера базы данных на веб-сервер. Пример:
Предположим, что у нас есть сущность 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, Quantity) 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);
Также вы всегда должны загружать только те данные, которые вам действительно нужны.