我可以将以下代码转换为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版本(很多?)比它看起来更难。 –