Кажется, я написал какой-то очень медленный фрагмент кода, который становится медленнее, когда мне приходится иметь дело с EF Core.
По сути, у меня есть список элементов, которые хранят атрибуты в строке Json в базе данных, так как я храню много разных элементов с разными атрибутами.
Затем у меня есть еще одна таблица, которая содержит порядок отображения для каждого атрибута, поэтому, когда я отправляю элементы клиенту, я заказываю их на основе этого порядка.
Это довольно медленно делать 700 записей за 18-30 секунд (откуда я запускаю свой таймер, а не весь блок кода).
var itemDtos = new List<ItemDto>();
var inventoryItems = dbContext.InventoryItems.Where(x => x.InventoryCategoryId == categoryId);
var inventorySpecifications = dbContext.InventoryCategorySpecifications.Where(x => x.InventoryCategoryId == categoryId).Select(x => x.InventorySpecification);
Stopwatch a = new Stopwatch();
a.Start();
foreach (var item in inventoryItems)
{
var specs = JObject.Parse(item.Attributes);
var specDtos = new List<SpecDto>();
foreach (var inventorySpecification in inventorySpecifications.OrderBy(x => x.DisplayOrder))
{
if (specs.ContainsKey(inventorySpecification.JsonKey))
{
var value = specs.GetValue(inventorySpecification.JsonKey);
var newSpecDto = new SpecDto()
{
Key = inventorySpecification.JsonKey,
Value = displaySpec.ToString()
};
specDtos.Add(newSpecDto);
}
}
var dto = new InventoryItemDto()
{
// create dto
};
inventoryItemDtos.Add(dto);
}
Теперь медленно сходит с ума, когда я добавляю EF еще несколько столбцов, из которых мне нужна информация.
В области // создания dto я получаю информацию из других таблиц
var dto = new InventoryItemDto()
{
// access brand columns
// access company columns
// access branch columns
// access country columns
// access state columns
};
Попытка доступа к этим столбцам в цикле занимает 6 минут для обработки 700 строк.
Я не понимаю, почему это так медленно, это единственное изменение, которое я действительно сделал, и я постарался загрузить все в.
Для меня это почти заставляет меня думать, что нетерпеливая загрузка не работает, но я не знаю, как проверить, если она или нет.
var inventoryItems = dbContext.InventoryItems.Include(x => x.Branch).ThenInclude(x => x.Company)
.Include(x => x.Branch).ThenInclude(x => x.Country)
.Include(x => x.Branch).ThenInclude(x => x.State)
.Include(x => x.Brand)
.Where(x => x.InventoryCategoryId == categoryId).ToList();
поэтому я подумал, что из-за этого скорость не будет сильно отличаться от исходных 18-30 секунд.
Я бы тоже хотел ускорить исходный код, но я не совсем уверен, как избавиться от двойных циклов foreach, которые, вероятно, замедляют его.