You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正ASP.NET Core MVC获取上月完成任务Top5员工的LINQ查询

问题修正方案

你的查询存在几个关键问题,以下是修正后的代码及问题说明:

核心问题分析

  1. 月份计算逻辑漏洞:直接用current_month - 1会导致1月时得到0,无法匹配任何月份;且未考虑年份,会错误统计到往年同月份的任务。
  2. 变量名冲突:Count(x => ...)中的x和外层遍历员工的x重名,导致EF Core无法正确解析表达式。
  3. 不必要的Include:你仅需统计任务数量,不需要加载所有EmployeeTasks数据,Include会增加无意义的性能开销。
  4. 未执行异步查询:方法标记为async但未用await执行查询,不符合异步方法规范。
  5. 缺少任务完成状态过滤:需求是统计完成的任务,但原代码未过滤任务是否完成(假设Task实体有IsCompleted布尔属性,若没有可忽略此判断)。

修正后的基础版代码

public async Task<IActionResult> Display()
{
    // 计算过去一个月的精确时间范围,避免跨年/跨月问题
    var now = DateTime.Now;
    var lastMonthStart = new DateTime(now.Year, now.Month, 1).AddMonths(-1);
    var lastMonthEnd = lastMonthStart.AddMonths(1).AddTicks(-1);

    var topEmployees = await _context.Employees
        .OrderByDescending(e => e.EmployeeTasks.Count(t => 
            t.DueDate >= lastMonthStart && 
            t.DueDate <= lastMonthEnd &&
            t.IsCompleted)) // 若无完成状态字段,删除此行
        .Take(5)
        .ToListAsync();

    return View(topEmployees);
}

可选优化:大数据量场景的分组统计

如果系统中任务数据量较大,建议直接从Task表分组统计,性能更优:

public async Task<IActionResult> Display()
{
    var now = DateTime.Now;
    var lastMonthStart = new DateTime(now.Year, now.Month, 1).AddMonths(-1);
    var lastMonthEnd = lastMonthStart.AddMonths(1).AddTicks(-1);

    var topEmployeeStats = await _context.Tasks
        .Where(t => t.DueDate >= lastMonthStart && t.DueDate <= lastMonthEnd && t.IsCompleted)
        .GroupBy(t => t.EmployeeId)
        .Select(g => new 
        {
            EmployeeId = g.Key,
            CompletedTasksCount = g.Count()
        })
        .OrderByDescending(s => s.CompletedTasksCount)
        .Take(5)
        .Join(_context.Employees, 
              stat => stat.EmployeeId, 
              emp => emp.Id, 
              (stat, emp) => new { Employee = emp, TaskCount = stat.CompletedTasksCount })
        .ToListAsync();

    return View(topEmployeeStats);
}

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:57:25