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
相关产品推荐
相关产品推荐

