C# Linq实现Left Join分组查询结果与原生SQL不一致问题求助
错误原因分析
- 计数对象错误:原生SQL统计的是主表
ActivityRecord的记录数COUNT(a.ActivityRecordId),原Linq中对左连接后可能为null的c(即ActivityRecordProgress对象)执行Count(),当左连接无匹配数据时c为null,多数ORM框架的Count()会自动过滤null值,导致计数或数据条目丢失。
- 计数对象错误:原生SQL统计的是主表
- 返回字段不匹配预期:原Linq的
label取的是分组键a.CustomerId,但预期返回的是客户名称CustomerName。
- 返回字段不匹配预期:原Linq的
- 缺少排序逻辑:原SQL包含
order by cTotal DESC倒序规则,原Linq未实现该逻辑,返回结果顺序会和预期不符。
- 缺少排序逻辑:原SQL包含
- 交换a、b关联顺序后数据变少的原因:交换后相当于以
ActivityRecordProgress作为主表左连ActivityRecord,没有进度记录的活动会被过滤,不符合「统计所有活动数量、不管是否有对应进度」的业务逻辑。
- 交换a、b关联顺序后数据变少的原因:交换后相当于以
修复后的Linq代码
var topfive = (from a in _db.ActivityRecords join b in _db.ActivityRecordProgresses on a.ActivityRecordId equals b.ActivityRecordId into leftjoin from c in leftjoin.DefaultIfEmpty() join d in _db.Customers on a.CustomerId equals d.CustomerId // 按客户ID+客户名分组,兼容同ID同名异常场景,也可直接读取客户名 group a by new { d.CustomerId, d.CustomerName } into grouped select new { label = grouped.Key.CustomerName, // 统计主表ActivityRecord的记录数,和原生SQL逻辑完全对齐 datas = grouped.Count() }) // 补充倒序逻辑,和SQL排序规则一致 .OrderByDescending(x => x.datas) .ToList();
内容的提问来源于stack exchange,提问作者Haminteu
相关产品推荐
相关产品推荐

