如何用单条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
相关产品推荐
相关产品推荐

