如何使用LINQ根据货架交易日志统计当前货架内有效箱子数量
货架有效箱子数统计LINQ正确实现方案
原代码错误原因
- 分组逻辑错误:将
Barcode和Event同时作为分组键,会把同一个条码的入库、出库记录拆分到两个不同分组,无法判断该条码的最新交易类型是入库还是出库 - 过滤逻辑错误:直接统计所有入库事件的分组数量,没有排除「已存在出库记录且出库时间晚于最后一次入库时间」的条码
正确实现代码
var getTotal = await _context.RackBoxLogs // 过滤指定货架的所有交易记录 .Where(c => c.RackId == rackId) // 按条码单独分组,同一个箱子的所有交易归入同一组 .GroupBy(c => c.Barcode) // 取每个条码的最新一条交易记录 .Select(g => g.OrderByDescending(c => c.DateTime).First()) // 最新交易为入库的条码就是当前仍在货架上的箱子 .Where(c => c.Event == "IN") // 统计数量即为有效箱子数 .CountAsync();
注:如果你的实体类中交易时间字段名为CreatedOn,请将代码中的c.DateTime替换为c.CreatedOn
逻辑验证
对于你给出的测试数据,该逻辑会遍历每个条码的最新交易:
- 条码ABC1235最新记录为IN,计数+1
- 条码ABC1237最新记录为IN,计数+1
- 其余条码最新记录为OUT,不计入
最终统计结果为2,符合预期。
内容的提问来源于stack exchange,提问作者Azri Zakaria
相关产品推荐
相关产品推荐

