簡體   English   中英

LINQ通過聯接返回最近日期的記錄

[英]LINQ returning records with most recent dates with a join

我正在嘗試創建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};

您需要的是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();

警告,我還沒有測試過。

除了.First()您還可以嘗試.FirstOrDefault()以便更輕松地處理異常。

這是使您前進的示例:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM