【问题标题】:EF/Linq - Sort collection before groupingEF/Linq - 分组前对集合进行排序
【发布时间】:2013-04-26 19:59:27
【问题描述】:

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

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

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

【问题讨论】:

  • 排序会影响结果,而不是您要加入的表。
  • @Jodrell 好的,那么我如何确保当我获得每个组的第一个条目时,第一个是最新的?
  • 您不能在 T-SQL 中的单个语句中真正做到这一点 - 按项目 ID 分组将为每个项目 ID 提供一行,并为其他列提供聚合值 - 您需要子查询获取每个项目的第一项,不确定如何转换为 EF 或 Linq...
  • @Charleh 这就是我面临的问题 - 我可以使用子查询编写 sql(实际上没有 group by),但将 ef 翻译成对我不起作用的位 - 我发现这个答案stackoverflow.com/a/4014958/81053 最初进行分组,然后使用它来支持另一个查询,即选择实体,其中只有一个加入实体 - 我已经接受了这个并添加了订单 - 但它不起作用.. .

标签: c# linq entity-framework


【解决方案1】:

更新

好的,这个怎么样?

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

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

【讨论】:

  • "每个项目实体的最新条目"。您的查询仅选择一个项目的条目。
  • @HoberMellow 适合所有项目我想列出最新的审计实体,而不仅仅是一个项目
  • @ChrisMoutray 更新了我的答案
  • @Trickery 干得好!这成功了,当我通读它时是有道理的:)
【解决方案2】:

认为你需要看看不同的方法。与其排序,不如分组,然后选择最大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));

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

【讨论】:

  • @HoberMellow 也是,不错。
猜你喜欢
  • 1970-01-01
  • 2010-11-03
  • 2015-09-18
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多