【问题标题】:Linq: Select Most Recent Record of Each GroupLinq:选择每个组的最新记录
【发布时间】:2018-01-19 19:50:42
【问题描述】:

我想使用 Linq 从 SQL Server 表中获取每个组的最新记录。

表格示例:

我想得到这个结果:

我的 Linq 查询为每家公司返回一条记录,但它不返回最近的记录:

var query = from p in db.Payments
            where p.Status == false 
            && DateTime.Compare(DateTime.Now, p.NextPaymentDate.Value) == 1
            group p by p.CompanyID into op                                          
            select op.OrderByDescending(nd => nd.NextPaymentDate.Value).FirstOrDefault();

我在这里缺少什么?为什么没有正确订购 NextPaymentDate?

!!更新!! 我的查询按预期工作。在分析了@Gilang 和@JonSkeet cmets 之后,我进行了进一步的测试,发现由于未更新的列,我没有得到预期的结果。

【问题讨论】:

  • 这对我来说是正确的 - 2015-11-13 03:30:50.127 每种情况下的最新结果。你认为哪个结果比这更近?
  • @JonSkeet 该图像是我想要实现的一个示例。真实结果显示较旧的记录(2015-11-13 03:12:21)。
  • 啊。如果您展示您实际得到的内容,这会有所帮助...为误读问题而道歉。
  • @JonSkeet 你是对的。很抱歉误导你

标签: linq entity-framework-6


【解决方案1】:
 var query = from p in db.Payments
             where p.Status == false
             group p by p.CompanyID into op
             select new { 
                 CompanyID = op.Key,
                 NextPaymentDate = op.Max(x => x.NextPaymentDate), 
                 Status = false
             };

您的查询未正确排序的原因是您的查询没有正确分组。您确实按 CompanyID 正确分组,但是您必须通过调用聚合函数来检索最大 NextPaymentDate。

状态可以被赋值为false,因为它已经被早期子句中的Where子句过滤了。

【讨论】:

  • 就 LINQ 而言,OP 的查询很好。它选择组,然后在每个组中选择一个元素。据我所知,它可以在 LINQ to Objects 中完美运行。如果它没有被转换成正确的 SQL,对我来说这听起来像是 SQL 转换器中的一个错误。
  • @Gilang 您的解决方案似乎有效。我需要进一步测试才能确定。我有一个新问题,我的原始表有更多列(PaymentID,RefPayment,Value,..)我如何在您的查询中获取这些列的值?
  • @Ricky 您可以像group p by new { p.CompanyID, p.OtherColumn, p.Another } 这样在'group by' 子句中添加更多列,然后通过像op.Key.CompanyID 这样从'Key' 属性访问它来将其添加到'select' 子句中。
  • @JonSkeet 嗯,我认为调用 FirstOrDefaultOrderByDescending 函数的方式会破坏 LINQ to SQL 查询
  • @Gilang:但它不应该 - 提供者应该弄清楚它需要做什么才能将该 LINQ 转换为有效的 SQL。您是否同意作为 LINQ 查询本身没问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 2021-11-01
  • 2020-06-21
  • 2021-02-25
  • 2021-12-30
  • 2020-08-19
相关资源
最近更新 更多