【问题标题】:How to optimize lambda queries in .NET Core?如何优化 .NET Core 中的 lambda 查询?
【发布时间】:2021-09-27 23:02:58
【问题描述】:

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

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();

这需要很长时间才能执行(结果是正确的),所以我问是否有可能的方法来减少响应时间。

【问题讨论】:

  • 对此我们无话可说。分析您的查询。
  • 你能看到这产生的原始 SQL 吗?它更有可能是导致您的性能问题的实际查询。
  • TimeSheetElements 表中大约有多少条记录?应该为 UserTaskId、UserId 和 Date 列建立索引以提高性能。

标签: c# .net-core optimization lambda


【解决方案1】:

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

因此,您应该先查询 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();

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

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2022-09-30
    • 2021-10-21
    • 2011-09-01
    相关资源
    最近更新 更多