通过连接返回具有最近日期的LINQ记录

本文关键字:日期 LINQ 记录 最近 连接 返回 | 更新日期: 2023-09-27 18:14:29

我正在尝试创建一个LINQ语句,该语句返回具有最近分配的任务历史日期的记录(任务)列表。这里有两个表,第一个是任务表,它包含了单个任务的所有信息,然后是任务历史表,它记录了任务是如何分配给谁的。这两个表都有TaskID,这是它们可以在连接上链接的地方。问题是,在任务历史记录中,可以有许多记录具有相同的TaskID,但我只想返回具有最近分配日期的记录,这是任务历史表中的一列。我该怎么做呢?

到目前为止我写的是:

var query = from task in db.AP_Tasks
            join taskH in db.AP_TaskHistory on task.TaskID equals taskH.TaskID
            orderby new {taskH.AssignDate}
            select new {task = task, assignedDate = taskH.AssignDate};
更新:

最近的代码:

        var query = from task in db.AP_Tasks
            from th in db.AP_TaskHistory
            where th.TaskID == task.TaskID
            orderby th.AssignDate
            select new {task = task, assignDate = th.AssignDate};

通过连接返回具有最近日期的LINQ记录

这里需要的是一个CROSS APPLY样式查询。

select AP_Tasks.*, history.AssignDate
from AP_Tasks
cross apply (
   select top 1 AP_TaskHistory.AssignDate
   from AP_TaskHistory
   where AP_Tasks.TaskID = AP_TaskHistory.TaskID
   order by AP_TaskHistory.AssignDate DESC
) history

看这里:我如何在LINQ-to-SQL中编写这个交叉应用查询?

我想这样的东西对你会有用的。

var query = (from task in db.AP_Tasks
            join taskH in db.AP_TaskHistory on task.TaskID equals taskH.TaskID
            orderby new {taskH.AssignDate} descending
            select new {task = task, assignedDate = taskH.AssignDate}).First();

请注意,我还没有测试过。

您可以尝试使用.FirstOrDefault()来代替.First(),以便更容易地处理异常。

下面是一个例子:

List<Task> tasks = new List<Task>();
tasks.Add(new Task {TaskID = 1});
tasks.Add(new Task {TaskID = 3});
tasks.Add(new Task {TaskID = 5});
List<TaskHistory> taskHistories = new List<TaskHistory>();
taskHistories.Add(new TaskHistory { TaskID = 3, AssignDate = DateTime.Now });
taskHistories.Add(new TaskHistory { TaskID = 3, AssignDate = DateTime.Now.AddDays(3) });
taskHistories.Add(new TaskHistory { TaskID = 1, AssignDate = DateTime.Now });
taskHistories.Add(new TaskHistory { TaskID = 1, AssignDate = DateTime.Now.AddDays(1) });
taskHistories.Add(new TaskHistory { TaskID = 1, AssignDate = DateTime.Now.AddDays(4) });
var query = from task in tasks
            join thist in taskHistories on task.TaskID equals thist.TaskID
            group new { t = task, date = thist.AssignDate } by task.TaskID into grouped
            from g in grouped
            where g.date == grouped.Max(taskInGroup => taskInGroup.date)
            select g;