Как оптимизировать лямбда-запросы в ядре .net - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь создать диаграмму, которая требует нескольких данных, это код в хранилище

var resultdb = await  _dbContext.TimeSheetElements
     .Where(t => t.UserId == userId &&
            t.Date.Month == month && 
            t.Date.Year == year)
     .GroupBy(t => t.Date)
     .Select(pc => 
         new ShowPointingChartViewModel
         {
             Day = pc.First().Date.DayOfWeek.ToString(),
             Date = pc.First().Date.ToString(),
             NormalHours = pc.Where(p => p.IsGuard == false && !taskType.Contains(p.UserTask.Type)).Sum(p => p.Duration),
             OutOfBuisnessHours = pc.Where(p => p.IsGuard == true).Sum(p => p.Duration),
             Holidays = pc.Where(p => p.UserTask.Type == "Holiday").Sum(p => p.Duration),
             PublicHolidays = pc.Where(p => p.UserTask.Type == "Public holiday").Sum(p => p.Duration),
             Illness = pc.Where(p => p.UserTask.Type == "Illness").Sum(p => p.Duration),
             GuardFees = pc.Count(p => p.UserTask.Type == "Night Fees"),
             Total = pc.Where(p=>p.UserTask.Type != "Night Fees").Sum(p => p.Duration)
          })
    .ToList();

На самом деле это занимает много времени (результаты верны), поэтому я спрашиваюесли есть возможность уменьшить время отклика.

1 Ответ

0 голосов
/ 04 июня 2019

Вы выполняете сложный запрос в запросе, как показано в вашем коде.Это создаст тяжелый запрос, который содержит слишком много WHERE в конструкторе ShowPointingChartViewModel.

. Поэтому вы должны сначала выполнить запрос EF и сделать его списком, прежде чем отобразить в свой собственный класс ShowPointingChartViewModel., затем выполните выбор списка с отображением на ShowPointingChartViewModel после завершения запроса.

Ваш код должен выглядеть следующим образом:

var resultList = await  _dbContext.TimeSheetElements
   .Where(t => t.UserId == userId && t.Date.Month == month && t.Date.Year == year)
   .GroupBy(t => t.Date).ToList();
var chartViewModel = resultList.Select(pc => 
     new ShowPointingChartViewModel
     {
         Day = pc.First().Date.DayOfWeek.ToString(),
         Date = pc.First().Date.ToString(),
         NormalHours = pc.Where(p => p.IsGuard == false && !taskType.Contains(p.UserTask.Type)).Sum(p => p.Duration),
         OutOfBuisnessHours = pc.Where(p => p.IsGuard == true).Sum(p => p.Duration),
         Holidays = pc.Where(p => p.UserTask.Type == "Holiday").Sum(p => p.Duration),
         PublicHolidays = pc.Where(p => p.UserTask.Type == "Public holiday").Sum(p => p.Duration),
         Illness = pc.Where(p => p.UserTask.Type == "Illness").Sum(p => p.Duration),
         GuardFees = pc.Count(p => p.UserTask.Type == "Night Fees"),
         Total = pc.Where(p=>p.UserTask.Type != "Night Fees").Sum(p => p.Duration)
      })
.ToList();

Теперь вы уменьшили круговую передачуназад и вперед к базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...