数据库表按ActionCode字段去重保留单条记录的实现需求
解决同一Item下重复Event的展示问题
你当前的代码问题出在分组逻辑上——只按ActionCode(对应event枚举)分组会把所有相同事件类型的记录合并成一条,不管它们属于哪个item,这就不符合“同一item下同一event仅显示一次”的需求(不同item的相同event应该正常展示,只有同item内的重复event需要去重)。
修复步骤
- 确认Item标识字段:根据你的表结构,
item_id对应实体类里的某个属性(比如预订IDBookingId,如果当前实体类GetBookingEventsRpcResponse里没包含这个字段,需要先补充进来,因为它是区分不同item的核心标识)。 - 修改分组逻辑:同时按「Item标识」和「ActionCode」作为分组键,这样只有同一个item下的相同event才会被归为一组。
- 保留原有展示顺序:先按原有逻辑排序(比如按
EventDateTime时间排序),再分组取每组第一条,保证展示结果符合原有逻辑。
修复后的代码示例
假设Item标识是BookingId(请根据实际业务替换为你的item_id对应属性):
// 先按原有展示逻辑排序(示例为按事件时间降序,可替换为你的原有排序规则) var sortedEvents = result.OrderByDescending(x => x.EventDateTime); // 按Item标识+ActionCode分组,每组取第一条 var uniqueEvents = sortedEvents .GroupBy(x => new { x.BookingId, x.ActionCode }) .Select(group => group.First()) .ToList();
更高效的数据库层面去重(可选)
如果数据量较大,建议直接在数据库查询阶段完成去重,减少内存处理压力。用窗口函数ROW_NUMBER()实现:
WITH RankedBookingEvents AS ( SELECT BookingEventId, EventDateTime, ActionCode, BookingId, -- 替换为你的item_id字段 ROW_NUMBER() OVER (PARTITION BY BookingId, ActionCode ORDER BY EventDateTime DESC) AS RowNum FROM YourBookingEventsTable -- 替换为你的表名 ) SELECT BookingEventId, EventDateTime, ActionCode FROM RankedBookingEvents WHERE RowNum = 1;
这里的ORDER BY EventDateTime DESC对应原有展示的时间排序规则,可根据需求调整。
内容的提问来源于stack exchange,提问作者lakykytik
相关产品推荐
相关产品推荐

