我可以將以下代碼轉換爲LINQ語句。將SQL語句轉換爲LINQ-to-SQL
SELECT reports.* FROM [dbo].[ReportLists] rl
INNER JOIN [dbo].[ReportItems] ri ON rl.Id = ri.ReportListId
INNER JOIN [dbo].[Reports] reports ON ri.Id = reports.ReportItemId
WHERE
reports.createdDate
IN (
SELECT
MAX(report_max_dates.createdDate)
FROM
[dbo].[Reports] report_max_dates
GROUP BY
report_max_dates.seedLot
)
目前我有它歸結爲這樣:以上
db.ReportLists.Select(rl => db.ReportItems
.Where(ri => ri.ReportListId == rl.Id)
.Select(ri => db.Reports
.Where(r => r.ReportItemId == ri.Id)
.GroupBy(r => new { r.seedLot })
.Select(g => g.OrderByDescending(x => x.createdDate).FirstOrDefault())));
與LINQ的問題是,它返回一個有標題更改的條目。在數據庫中,我保存了所有記錄的歷史記錄(因此需要創建日期順序中的第一個記錄。當我將標題x中的報告更改爲標題y時,它顯示在兩個標題下,當我只想要最近的記錄時因此是下標題y中的一個。
EDIT 對不起缺乏細節。我有保持信息有關的報告(seedlot作爲一個標識符)一個報告表中。每當報告進行編輯時,一個新的記錄插入(與更新舊版本相比),以保持歷史記錄在這種情況下,createdDate的最大條目表示報告是最近要顯示的記錄,然後將報告分組爲標題或ReportItems。保留標題和相關報告。這些reportItems保存在ReportList中,例如th在我可以打印出所需格式的JSON,並且只包含由ReportItems鏈接到的狀態列和ID。
如果將報告從標題a移至標題b,則會輸入一條新記錄,並將標題外鍵鏈接至所更改的標題。當發生這種情況時,上面給出的LINQ返回每個單獨的ReportItem下的記錄,它應該只返回標題b的最新條目(來自上面的示例)。除此之外,LINQ語句僅返回createdDate的最新記錄。
這裏是我的類結構(模仿DB結構爲好)
public class ReportList {
public int Id {get;set;}
public string status {get;set;}
public List<ReportItem> {get;set;}
}
public class ReportItem {
public int Id {get;set}
public string title {get;set;}
public List<Report> {get;set;}
}
public class Report {
public int Id {get;set;}
public string Lot {get;set;}
... Other data ...
public DateTime createdDate {get;set;}
}
感謝, DMAN
所以我正確理解seed_lot是區分真正獨特的報告與另一個*和*報告遇到名稱變化的區別?也就是說,就report_max_dates而言,重新命名的報告與真正獨特(不相關)的報告沒有區別? –
請詳細說明。解釋你想要的。很難從SQL代碼片斷和錯誤的linq查詢中推斷出來。並解釋一個報告的各個版本如何保存在一起。 –
在我看來,你需要遍歷一連串的更新記錄,以獲得基於seed_lot的化身的報告的* latest *版本,這可能會使LINQ版本(很多?)比它看起來更難。 –