Dadadumdums
@Dadadumdums
веб-разработчик, мечтающий стать DBA

Как ускорить LINQ запрос?

Появилась проблема откуда не ждал...

Вот такой монстр у меня получился с моими знаниями:

data - IEnumerable T на порядка 400 элементов.
LogicalName - byte array

var result = (from gdt in groupedDataTime
                         join ad in activeDevices
                         on gdt.Key.DeviceId equals ad.DevId
                         join a in addresses
                         on ad.GAID equals a.GAID
                         select new DeviceDto()
                         {
                             Id = (int)ad.DevId,
                             SerialNo = ad.SerialNo,
                             Address = a.UnitName,
                             DevTypeId = ad.DevTypeId,
                             SubType1 = ad.SubType1,
                             SubType2 = ad.SubType2,
                             DateInstall = ad.DateInstall,
                             GroupId = ad.GroupId,
                             Time = gdt.Key.Time
                         }).ToList();

var count = result.Count();

 for (var i = 0; i < count; i++)
            {
                result[i].Total = data.Where(x => x.DeviceId == result[i].Id && x.Time == result[i].Time && (x.LogicalName.SequenceEqual(Flags.DeviceTotal) || x.LogicalName.SequenceEqual(Flags.DeviceTotal7))).Select(x => x.NormValue).FirstOrDefault() / 1000;
            }


Загвоздка в том, что цикл "for" отрабатывает неимоверно долгое время(400 объектов в списке result порядка 20-30 секунд)

Есть ли способ ускорить этот процесс?
  • Вопрос задан
  • 1193 просмотра
Решения вопроса 1
Dadadumdums
@Dadadumdums Автор вопроса
веб-разработчик, мечтающий стать DBA
поменял IEnumerable на IList, все стало работать моментально
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ImmortalCAT
@ImmortalCAT
C# loving
Если возможно
напишите Select в начале, это уменьшит кол-во столбцов которые вы дергаете.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы