如何在.net Core中优化Lambda查询

时间:2019-06-04 11:24:01

标签: c# .net lambda core

我正在尝试创建需要多个数据的图表 这是存储库中的代码

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 :(得分:0)

您正在查询中进行大量查询,如代码中所示。这将生成一个繁重的查询,该查询在ShowPointingChartViewModel的构造函数中包含太多WHERE。

因此,在映射到您自己的ShowPointingChartViewModel类之前,应先对EF进行查询并将其作为列表,然后在完成后对映射到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();

现在,您减少了往返数据库的往返行程。