EF迁移SQL报表时Group By不含LoginName的查询实现问题
解决方案
原SQL核心逻辑是:先对Specifications表按clientid和doctype去重,关联portal_logins后,仅按clientid和doctype分组统计数量,同时输出对应的loginname(默认一个clientid对应唯一的loginname)。当前EF代码错误地将loginName加入分组键,导致分组逻辑偏离需求,修正方案如下:
修正后的EF代码
return await _nfContext.Specifications .Select(x => new { x.Clientid, x.Doctype }) .Distinct() .Join( _nfContext.PortalLogins, spec => spec.Clientid, login => login.Clientid, (spec, login) => new { login.Loginname, spec.Clientid, spec.Doctype } ) .Where(x => x.Clientid != "0") // 仅按clientid和doctype分组,移除loginName .GroupBy(c => new { c.Clientid, c.Doctype }) .Select(result => new TotalActiveConnections { ActiveConnections = result.Count(), ClientId = result.Key.Clientid, // 同一个clientid对应的loginname唯一,取组内任意一个即可 LoginName = result.First().Loginname }) .OrderByDescending(x => x.ActiveConnections) .ToListAsync() .ConfigureAwait(false);
关键说明
- 分组键仅保留
Clientid和Doctype,完全对齐原SQL的GROUP BY逻辑。 - 由于
loginname是和clientid一一关联的(原SQL能正常执行也隐含这个前提),所以通过result.First().Loginname即可获取该clientid对应的登录名,无需将其加入分组键。如果担心存在多个loginname对应同一个clientid的情况,可根据业务需求改用Max(loginname)或Min(loginname)保证结果稳定。
内容的提问来源于stack exchange,提问作者user3133436
相关产品推荐
相关产品推荐

