You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:20:27