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

问题描述 投票:0回答:1

我有一个包含两个实体的 ASP.NET Core MVC 应用程序:

Employee
Task
。这些实体具有一对多的关系。

A

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
.

有人知道如何更正这个查询吗?

c# sql-server entity-framework linq asp.net-core-mvc
1个回答
0
投票

使用 current_month 变量按截止日期过滤任务可能会导致查询问题。如果当前月份是一月(值为 1),则从 current_month 中减去 1 可能不会总是产生预期的结果。

要解决此问题,您可以修改查询以使用 DateTime 属性月和年根据截止日期过滤任务。使用以下查询,您可以过滤上个月到期的任务

// 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();
© www.soinside.com 2019 - 2024. All rights reserved.