如何使用LINQ从分组查询中获取最后两条交易记录?
获取最后两条Transactions记录的解决方案
嘿,我看你现在需要从你的LINQ查询里提取最后两条Transactions相关记录对吧?先结合你给出的代码片段,我来帮你调整出合适的解决方案。
首先得明确:“最后两条”一般是指时间最新的两条记录,所以我们需要先按时间字段排序,再筛选出目标记录。下面分两种常见场景给出方案:
场景1:整个结果集中的最后两条记录
如果是要从所有符合条件的记录里,拿到时间最晚的两条,可以在你的原查询基础上,增加排序和取数逻辑:
var summary = (from tType in _context.CommandCentre.TransactionTypes join tSummary in _context.CommandCentre.TransSummary on tType.Id equals tSummary.TransactionType // 这里优化了枚举比较,不用转字符串,更高效且不易出错 where tSummary.ChargeFlag == ChargeFlag.Overcharge group tSummary by new { tType.Name, tSummary.NumberOfTransactions, tSummary.PeriodDate } into gResult select new { Fee = gResult.Key.Name, NumberOfTransactions = gResult.Key.NumberOfTransactions, PeriodDate = gResult.Key.PeriodDate }) // 按时间字段倒序,让最新的记录排在前面 .OrderByDescending(item => item.PeriodDate) // 取前2条,也就是最新的两条 .Take(2) // 如果需要按时间正序展示(最早的那条在前),可以添加这个排序 .OrderBy(item => item.PeriodDate) .ToList();
场景2:每个Fee分组下的最后两条记录
如果是要针对每个费用类型(Fee),分别取出该类型下的最后两条交易记录,就需要在分组内部做处理:
var summary = from tType in _context.CommandCentre.TransactionTypes join tSummary in _context.CommandCentre.TransSummary on tType.Id equals tSummary.TransactionType where tSummary.ChargeFlag == ChargeFlag.Overcharge // 只按费用名称分组,方便后续获取该组下的交易记录 group tSummary by new { tType.Name } into gResult select new { Fee = gResult.Key.Name, // 分组内按时间倒序,取最后两条 LastTwoTransactions = gResult.OrderByDescending(trans => trans.PeriodDate) .Take(2) .Select(trans => new { trans.NumberOfTransactions, trans.PeriodDate }) .ToList() };
小提示
- 排序字段我用了
PeriodDate,你可以根据实际业务调整为对应的时间字段(比如创建时间CreateDate等)。 - 原代码里的
ChargeFlag转字符串比较可以优化成直接枚举比较,避免字符串转换的性能损耗和潜在错误。
内容的提问来源于stack exchange,提问作者Navyseal
相关产品推荐
相关产品推荐

