我可以帮忙将以下内容转换为 LINQ 语句吗?
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 的问题是它返回的条目标题已更改。在数据库中,我保留所有记录的历史记录(因此需要在 createdDate 上按降序排列第一个。当我将报告从标题 x 更改为标题 y 时,当我只想要最新的记录时,它会显示在两个标题下因此成为标题 y 下的那个。
编辑 对不起,缺乏细节。我有一个报告表,其中包含有关报告的信息(seedlot 是标识符)。每当编辑报告时,都会插入一条新记录(而不是更新旧记录),以便保留历史记录。在这种情况下,createdDate 的最大条目表示报告是要显示的最新记录。然后将报告分组为标题或 ReportItems。这些报告项目包含标题和相关的报告。这些reportItems 保存在ReportList 中,这样我就可以以所需的格式打印出JSON,并且只包含一个状态列和由ReportItems 链接的id。
如果将报告从标题 a 移动到标题 b,则会输入一条新记录,其中标题外键链接到它更改为的标题。当发生这种情况时,上面给定的 LINQ 在它应该只返回标题 b 的最新条目时返回每个单独的 ReportItem 下的记录(来自上面的示例)。除此之外,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;}
}
谢谢,德曼