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

使用GroupBy函数获取各Success状态分类最新UpdatedDate的首行记录

按卡类型分组获取最新成功交易记录的代码实现

嘿,我来帮你梳理下这个问题哈~首先得指出你现有代码里的两个关键问题:

  • 语法错误:Where(w => w.Status = "S")这里用了赋值运算符=,应该改成相等判断的==,不然编译都通不过哦
  • 逻辑问题:你在GroupBy之后直接尝试构造Model,但GroupBy返回的是分组集合(IGrouping),不是单条记录,所以没法直接取CardTypeID这类属性,得先从每个分组里拿到排序后的第一条数据

正确的实现方案(两种常用方式)

方式一:GroupBy后提取每组首条记录(适用于LINQ to Objects或EF Core)

先筛选成功状态、按更新时间倒序,分组后取每组的第一条:

var latestSuccessStatuses = ldstatusC.LoadCardStatus
    .Where(w => w.Status == "S") // 修正为==判断
    .GroupBy(gSt => gSt.CardType)
    .Select(group => 
        group.OrderByDescending(sDate => sDate.Updated_Date).FirstOrDefault()) // 每组内倒序后取第一条
    .Select(s => new Models.MODEL_LoadCardStatus() 
    {
        CardTypeID = s.CardTypeID,
        CardType = s.CardType,
        Status = s.Status,
        Updated_Date = s.Updated_Date
        // 其他需要映射的属性按需添加
    })
    .ToList();

注意:如果用EF Core,这种写法会被翻译成对应的SQL(比如用ROW_NUMBER或者TOP 1 WITH TIES),性能也不错。

方式二:用窗口函数ROW_NUMBER(EF Core 3.0+推荐,更高效)

如果是用EF Core,直接用窗口函数可以在数据库层面完成分组排序和取首条,减少内存处理:

var latestSuccessStatuses = ldstatusC.LoadCardStatus
    .Where(w => w.Status == "S")
    .Select(s => new 
    {
        s,
        RowNum = EF.Functions.RowNumber()
            .Over(partitionBy: s.CardType, orderBy: s.Updated_Date descending)
    })
    .Where(x => x.RowNum == 1)
    .Select(x => new Models.MODEL_LoadCardStatus()
    {
        CardTypeID = x.s.CardTypeID,
        CardType = x.s.CardType,
        Status = x.s.Status,
        Updated_Date = x.s.Updated_Date
        // 其他属性
    })
    .ToList();

这种方式会生成更高效的SQL,直接在数据库里完成分组排序和筛选,适合大数据量的场景。

总结

你的原代码思路方向是对的,但卡在了GroupBy后没有正确提取分组内的首条记录,还有语法错误。上面两种方式都能完美实现你的需求:筛选成功状态、按卡类型分组、取每组最新更新的那条记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:00:08