我可以帮忙将以下内容转换为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下的那个。
编辑 抱歉,缺少详细信息。我有一个报告表,其中包含有关报告的信息(后遗症是标识符)。每当编辑报告时,都会插入一条新记录(与更新旧记录相比),以便保留历史记录。在这种情况下,那么createdDate的最大条目指示该报告是要显示的最新记录。然后将报告分为标题或ReportItems。这些报告项目包含标题和关联的报告。这些reportItems保存在ReportList中,这样我就可以以所需格式打印JSON,并且只包含一个状态列和由ReportItems链接的ID。
如果报告从标题a移到标题b,则会输入一条新记录,其中标题外键链接到更改为的标题。当发生这种情况时,上述给定的LINQ仅在返回标题b的最新条目时才返回每个ReportItem下的记录(来自上面的示例)。除此之外,LINQ语句仅返回createdDate的最新记录。
这是我的类结构(也模仿数据库结构)
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
更改了数据库架构以将其整理平整,从而减少了很多分支。
现在,报告才是根目录,我只有一张附在报告中的标题表。
谢谢大家的建议!