如何找到LINQ查询结果的前5行?

2ekbmq32  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(126)

我有一个ASP .NETCoreMVC应用程序,它包含两个实体:EmployeeTask。这些实体具有一对多关系。
Task由一个受让人(被指派处理它的Employee)和一个到期日以及其他属性组成。
我需要显示上个月完成任务数最多的5名员工。
我尝试了以下方法:

public async Task<IActionResult> Display()
{
    int current_month = DateTime.Now.Month;

    var employees = _context.Employees
        .Include(t => t.EmployeeTasks)
        .OrderByDescending(x => 
            x.EmployeeTasks.Count(x => x.DueDate.Month == current_month - 1))
        .Take(5);

    return View(employees);
}

此查询无法正常工作,就好像它无法识别条件一样
此查询无法正常工作-似乎无法识别条件
DueDate.Month == current_month - 1 .
有人知道如何更正此查询吗?

brgchamk

brgchamk1#

使用current_month变量按到期日筛选任务可能会导致查询问题。如果当前月份是January(值为1),则从current_month中减去1可能不会始终得到预期结果。
若要解决此问题,可以使用DateTime属性Month和Year修改查询,以根据任务的到期日期筛选任务。使用以下查询,可以筛选在上个月到期的任务

// Get the start and end dates of the previous month
    var currentDate = DateTime.Now;
    var startDate = new DateTime(currentDate.Year, currentDate.Month, 1).AddMonths(-1);
    var endDate = startDate.AddMonths(1).AddDays(-1);

    // Retrieve the top 5 employees who completed the most tasks in the previous month
    var employees = await _context.Employees
        .Include(e => e.EmployeeTasks)
        .OrderByDescending(e => e.EmployeeTasks.Count(t => t.DueDate >= startDate && t.DueDate <= endDate))
        .Take(5)
        .ToListAsync();

相关问题