【问题标题】:LINQ returning records with most recent dates with a joinLINQ 返回具有最近日期的记录并带有连接
【发布时间】:2014-07-23 15:15:39
【问题描述】:

我正在尝试创建一个 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};

【问题讨论】:

  • 如果您需要最新的orderby th.AssignDate =>orderby th.AssignDate desc

标签: c# sql linq


【解决方案1】:

您需要的是一个 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

请看这里:How do I write this cross apply query in LINQ-to-SQL?

【讨论】:

    【解决方案2】:

    我认为这样的事情对你有用。

    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(),以便更轻松地处理异常。

    【讨论】:

    • 这个问题是它只返回一条记录
    • @user3788671 问题是返回最近分配日期的记录
    • 啊,我明白了,你想要与每个任务关联的最新记录。
    • 是的,这就是我要找的。抱歉,如果不是很清楚
    【解决方案3】:

    这里有一个例子可以帮助你:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-14
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      相关资源
      最近更新 更多