You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条LINQ查询优先返回Success状态而非最新的产品记录

实现方案

你只需要调整分组内的排序规则,给Success状态的记录最高排序优先级,再叠加创建时间倒序规则,就能满足「优先取Success记录、无Success则取最新时间记录」的需求。

最终查询代码

var query = list
    .GroupBy(g => g.ProductId)
    .Select(g => g
        // 第一排序规则:Success状态权重最高,优先排在最前面
        .OrderByDescending(s => s.Status == "SUCCESS")
        // 第二排序规则:同优先级下按创建时间倒序,保证取最新记录
        .ThenByDescending(s => s.Created)
        .FirstOrDefault())
    .Select(s => new ProductDto
    {
         ProductId = s.ProductId,
         Created = s.Created,
         Status = s.Status
    });

效果说明

  • 对于ProductId为1的分组,SUCCESS状态的记录会排在最前,会被优先选中,不会取到时间更晚的CANCELLED记录
  • 对于ProductId为2的分组,没有SUCCESS状态的记录,会直接取时间最新的VALIDATE记录
  • 如果存在多条SUCCESS状态的记录,会自动取时间最新的那条SUCCESS
  • 该逻辑同时兼容内存LINQ查询和EF Core数据库查询,不需要额外适配。如果业务中Status大小写不固定,可以把判断条件替换为不区分大小写的相等判断适配场景。

你也可以把两次Select合并为一次,效果完全一致:

var query = list
    .GroupBy(g => g.ProductId)
    .Select(g => g
        .OrderByDescending(s => s.Status == "SUCCESS")
        .ThenByDescending(s => s.Created)
        .Select(s => new ProductDto
        {
             ProductId = s.ProductId,
             Created = s.Created,
             Status = s.Status
        })
        .FirstOrDefault());

内容的提问来源于stack exchange,提问作者doorman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:09:04