使用EF Core Filtered Include查询单条数据时出现Invalid column name错误
问题根因
你遇到的是EF Core 5.x版本的已知Bug,问题出在带筛选的Include(Filtered Include)搭配直接调用带谓词的First/Single等单条查询方法时,EF Core的SQL生成逻辑出现错误,错误裁剪了关联表的字段映射,所以会提示找不到LocationId、HistoryId这类合法字段。全量查询时走的是另一条SQL生成分支,没有触发这个问题。
可行解决方案
所有方案均无需修改模型注解或Fluent配置,不会被脚手架生成操作覆盖:
方案1:升级EF Core版本
这个Bug已经在EF Core 6.0及更高版本中被官方修复,只需将项目中EF Core相关的Nuget包升级到6.0+版本即可,无需修改任何业务代码或模型配置。
方案2:调整查询写法(兼容EF Core 5.x版本)
如果受项目依赖限制暂时无法升级EF Core大版本,可以将单条查询的过滤条件提前放到Where方法中,避免触发有问题的查询优化逻辑,修改后的查询代码如下:
var device = _apiContext.Devices.AsNoTracking() .Where(d => d.DeviceId == deviceId) // 将Id过滤条件提前到Where .Include(d => d.Histories.OrderByDescending(h => h.DateFrom).Take(1)) .ThenInclude(h => h.Location) .Include(d => d.Attributes) .First() // 不需要再带谓词,前面已经完成过滤 .ToModel();
这种写法会让EF Core走和全量查询一致的SQL生成逻辑,不会出现字段映射错误的问题。
内容的提问来源于stack exchange,提问作者thinkOfaNumber
相关产品推荐
相关产品推荐

