EF / Linq - 在分组之前对集合进行排序

时间:2013-04-26 11:12:30

标签: c# linq entity-framework

我在项目表和审计表之间有一对多的关系。我试图从审计表中挑选出每个项目实体的最新条目。

根据我的理解,我应该能够在按项目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的最早审核条目,而不是最新的。

此查询是否有问题;我错过了一些明显的东西吗?

2 个答案:

答案 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>进行了测试,上述工作也适用。