我正在尝试将以下内容转换为C#中的LINQ to SQL语句。任何人都可以帮我一把吗?基本上我的表记录了所有变更历史记录,以便每个种子图的创建日期最大日期是最新记录和正确显示的日期。
SELECT
reports.*
FROM
[dbo].[Reports] reports
WHERE
reports.createdDate
IN (
SELECT
MAX(report_max_dates.createdDate)
FROM
[dbo].[Reports] report_max_dates
GROUP BY
report_max_dates.Lot
)
到目前为止,这就是我所拥有的。
var result = (from report in db.Reports
where report.createdDate == (from report_max in db.Reports
group report_max by report_max.Lot into report_max_grouped
select report_max_grouped).Max()
select report);
我无法弄清楚如何获取所有报告的MAX
日期以及如何在report.createdDate上执行IN
语句。
修改
如何立即对声明进行建模如果我有一个包含多个报告的单独标题。例如,我有报告l,m,n,x,y,z。报告l m n通过外键reportList_Id链接到它们的标题“hello”,x y c以相同的方式链接标题“goodbye”。
基本上我现在需要将所有报告都放到以下对象中
public class ReportRoot : DbContext {
public DbSet<ReportList> reportList {get;set;}
}
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;}
public DateTime createdDate {get;set;}
}
我的课程已完整列出。我需要做的是返回包含多个reportItems(包含标题的报告列表)的reportList。所以这些ReportItems将包含报告本身。因此,我需要使用max createdDate返回所有报告,就像我们对查询的第一部分所做的那样,但我需要将它们作为ReportList对象返回,这些对象包含ReportItems,以便多个报告具有其标题。
我需要上述格式的对象才能将JSON正确序列化和反序列化到我的对象中。
我想出了这个,它将它们分开并返回标题,但是我记录了不需要的记录,例如我更改了标题的记录显示在两个标题下。
db.ReportLists.Select(rl => db.ReportItems
.Where(ri => ri.ReportListId == rl.Id)
.Select(ri => db.Reports
.Where(r => r.ReportItemId == ri.Id)
.GroupBy(r => r.seedLot)
.Select(g => g.OrderByDescending(x => x.createdDate).FirstOrDefault())))
Thansk, DMAN
答案 0 :(得分:2)
var recentDates = Reports
.GroupBy(r=>r.SeedLot, r=>r.CreatedDate)
.Select(rg=>rg.Max());
var result =
from r in Reports
join d in recentDates
on r.createdDate equals d
select r;
答案 1 :(得分:1)
我可能理解不好,但基本上,你想要每个不同批次的最后创建日期? 如果是,那么
db.Reports
.GroupBy(r => r.Lot)
.Select(g => g.OrderByDescending(x => x.createdDate).FirstOrDefault());
或者像你一样(但我不确定这是最简单的方法)
var maxDates = Reports.GroupBy(r => r.Lot)
.Select(x => x.Max(g => g.createdDate).ToList();
var result = db.Reports.Where (m => maxDates.Contains(m.createdDate));
修改强>
你的例子不是那么清楚(为了清楚起见,我改了一点名字。)
首先使用代码,你应该有类似的东西(想法是一样的)
课程报告
public class Report {
public int Id {get;set;}
public int Lot {get;set;}
public Datetime CreatedDate {get;set;}
public virtual Category Category {get;set;} //Navigation property
}
类别
public class Category {
public int Id {get;set;}
public string Title {get;set;}
public virtual IList<Report> ReportList {get;set;} //Navigation property
}
最终成为“结果类”
public class ReportList {
public string Title {get;set;}
public List<Report> ReportList {get;set;}
}
然后查询可以成为
db.Reports
.GroupBy(r => r.Lot)
.Select(g => g.OrderByDescending(x =x.createdDate).FirstOrDefault())
.GroupBy(m => m.Category.Id)
.Select(g => new ReportList {
Title = g.FirstOrDefault().Category.Title,
ReportList = g.OrderBy(x => x.Lot)
});