我正在尝试创建需要多个数据的图表 这是存储库中的代码
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();
实际上,这需要很长时间才能执行(结果正确),所以我问是否有减少响应时间的可能方法。
答案 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();
现在,您减少了往返数据库的往返行程。