C# EF/Linq-分组前对集合排序

C# EF/Linq-分组前对集合排序,c#,linq,entity-framework,C#,Linq,Entity Framework,我在项目表和审计表之间有一对多关系。我试图从审计表中找出每个项目实体的最新条目 根据我的理解,在按项目id进行分组之前,我应该能够按日期对审计集合进行排序,这样我就可以为每个组选择第一个条目(项目id)以获取最新条目 但是,当我运行ef/linq查询时,结果不正确,order by似乎被忽略——即使生成的sql也不包含order by语句 这是我试过的一个简单的例子 using (var ctx = new MyDbContext()) { var audit = from a in c

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

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

这个查询是否有问题;我是否遗漏了一些明显的东西?

我认为您需要考虑另一种方法。与其排序,不如分组,然后选择最大
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));

编辑-进行了一些更改,并使用测试类和
列表进行了测试
,上述操作也可以使用。

更新

好吧,这个怎么样

ctx.ProjectAudits
    .GroupBy(p => p.ProjectId)
    .Select(p => p.OrderByDescending(j => j.CreatedDate).FirstOrDefault())
    .ToList();

我这里没有VS,但理论上它应该将您的记录分组,按创建日期在组内排序,并从每组中选择第一条记录。

排序会影响结果,不是您要加入的表。@Jodrell好的,那么如何确保在获取每个组的第一个条目时,第一个条目是最新的呢?t-SQL中的一条语句不能真正做到这一点-按项目ID分组将为每个项目ID提供一行,并为其他列提供聚合值-您需要子查询以获取每一项的第一项,不确定如何转换为EF或Linq…@Charleh这是我面临的问题-我可以编写sql(实际上没有分组依据)使用子查询,但在对我不起作用的位中转换ef-我找到了这个答案,它最初做了一个分组,然后用它来启动另一个查询,即选择实体和其中的一个连接实体-我已经采取了这一点,并添加了order by-但它不起作用…@HoberMellow Yep,这也很好。“每个项目实体的最新条目”。您的查询仅为一个项目选择条目。@HoberMellow这适用于所有项目我想列出最新的审核实体,而不仅仅是一个project@ChrisMoutray更新我的answer@Trickery干得好!这真是个绝招,当我通读它时,它是有意义的:)