我在项目表和审计表之间有一对多的关系。我试图从审计表中挑选出每个项目实体的最新条目。
根据我的理解,我应该能够在按项目ID分组之前按日期对审核集合进行排序,以便我可以为每个组(项目ID)选择第一个条目以获取最新条目。
但是当我运行我的ef / linq查询时,结果不正确并且order-by似乎被忽略 - 即使生成的sql也没有包含order by语句。
这是我尝试的简单例子。
using (var ctx = new MyDbContext())
{
var audit = from a in ctx.ProjectAudits
orderby a.CreatedDate descending
group a by a.ProjectId into grp
select grp.FirstOrDefault();
var resultsList = audit.ToList();
}
结果始终返回每个项目ID的最早审核条目,而不是最新的。
此查询是否有问题;我错过了一些明显的东西吗?
答案 0 :(得分:4)
<强>更新强>
好的,这个怎么样?
ctx.ProjectAudits
.GroupBy(p => p.ProjectId)
.Select(p => p.OrderByDescending(j => j.CreatedDate).FirstOrDefault())
.ToList();
这里没有VS和我在一起,但理论上它应该将你的记录分组,按照创建日期在组内排序,然后从每个组中选择第一条记录。
答案 1 :(得分:1)
我认为你需要看一个不同的方法。而不是排序,为什么不分组,然后选择最大CreatedDate
的审核。我没有测试过以下内容,只是把它扔出去了:
var audit = from a in ctx.ProjectAudits
group a by a.ProjectId into grp
select new {
// whatever your other properties are
CreatedDate = grp.Max(i => i.CreatedDate)
};
或者,因为大多数人更喜欢方法语法:
var audit = ctx.ProjectAudits
.Where(i => i.CreatedDate == ctx.ProjectAudits
.Max(x => x.CreatedDate));
编辑 - 进行了一些更改,并使用测试类和List<TestClass>
进行了测试,上述工作也适用。