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

EF Core从2.1.1升级至7.0.11后报'emptyprojectionmember'键不存在错误

EF Core 7.0升级后GroupBy查询报错"emptyprojectionmember"的解决办法

问题原因

EF Core 7.0对查询转换逻辑做了优化,原代码中GroupBy(c => c.ContactId).Select(c => c.First())的写法在新版本中无法正确生成SQL查询计划,导致查询引擎处理投影时出现字典键缺失的错误。另外你代码里第二行的qitems是items的笔误,需先修正这个编译问题。

解决方案

方案一:使用窗口函数(推荐,数据库端执行)

改用RowNumber窗口函数实现按ContactId去重并取第一条记录,所有逻辑在数据库端完成,性能最优且避免转换错误:

var items = _dbContext.Contacts
    .Where(c => c.UserId == userId)
    .Select(c => new 
    {
        Contact = c,
        RowNum = EF.Functions.RowNumber().Over(partitionBy: c.ContactId, orderBy: c.CompanyName)
    })
    .Where(x => x.RowNum == 1)
    .Select(x => x.Contact)
    .OrderBy(c => c.CompanyName)
    .Skip(skip)
    .Take(pageSize)
    .ToList();

方案二:客户端评估(不推荐,大数据量慎用)

如果暂时无法调整查询逻辑,可以先将GroupBy后的结果加载到内存再处理分页,但这种方式会把所有符合条件的数据先拉到本地,数据量大时性能很差:

var items = _dbContext.Contacts
    .Where(c => c.UserId == userId)
    .GroupBy(c => c.ContactId)
    .Select(c => c.First())
    .ToList() // 先加载到内存
    .OrderBy(c => c.CompanyName)
    .Skip(skip)
    .Take(pageSize)
    .ToList();

内容的提问来源于stack exchange,提问作者Angelo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:20:12