Одна из более медленных частей запроса к базе данных - это передача выбранных данных из СУБД в локальный процесс. Следовательно, разумно выбирать только те свойства, которые вы действительно планируете использовать.
Например, кажется, что Order
имеет ноль или более ItemAttributes
. Evey ItemAttribute
принадлежит ровно одному Order
, используя внешний ключ OrderId
.
Если вы получите все Orders
с Id в ArryOrderId
, каждый ордер с его тысячой ItemAttributes
, вы знаете, что каждый ItemAttribute
будет иметь внешний ключ OrderId
с тем же значением, что и Id Заказ, к которому он принадлежит. Отправлять 1000 раз одно и то же значение бесполезно.
При запросе данных с использованием структуры сущностей всегда используйте Select. Выберите только те свойства, которые вы действительно планируете использовать. Используйте «Включить» только в том случае, если вы хотите изменить извлеченные объекты.
var result = dbContext.Orders
.Where(order=>aryOrderId.Contains(order.id)
.Select(order => new
{ // select only the properties you plan to use:
Id = order.Id,
...
Customer = order.Customer.Select(customer => new
{ // again: only the properties you plan to use
Id = order.Customer.Id,
Name = order.Customer.Name,
...
},
ItemAttributes = order.ItemAttributes.Select(itemAttribute => new
{
...
})
.ToList(),
Dimensions = order.Dimensions.Select(dimension => new
{
...
})
.ToList(),
....A Bunch more.....
})
.ToList();
Если после выбора только тех свойств, которые вы действительно планируете использовать, запрос по-прежнему занимает слишком много времени, подумайте еще раз: действительно ли мне нужны все эти свойства.
Другим решением для ограничения времени выполнения является получение даты «на страницу» с помощью Skip / Take. Разумеется, существует опасность, что при просмотре страницы 10 данные страницы 1 могут быть изменены таким образом, что страница 10 должна интерпретироваться по-разному.