5

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

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

这个查询有问题吗?我错过了一些明显的东西吗?

4

2 回答 2

6

更新

好的,这个怎么样?

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

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

于 2013-04-26T11:34:35.563 回答
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));

编辑- 进行了一些更改,并使用测试类和 a 进行了测试List<TestClass>,上面的内容适用于此。

于 2013-04-26T11:25:07.167 回答