LINQ使用Include关联查询时如何过滤关联集合导航属性的内容
问题原因
你遇到的报错是因为**带过滤条件的Include(Filtered Include)**仅在Entity Framework Core 5.0及以上版本原生支持,如果你使用的是EF6、或者版本低于5.0的EF Core,就不支持直接在Include内对集合导航属性加Where过滤,所以会触发该错误。
解决方案
方案1:升级到EF Core 5.0+
如果你可以升级ORM版本,直接使用对应写法即可(注意检查Status.Recieved的拼写是否正确,常规拼写是Received,拼写错误也会导致查询异常):
var Result = db.document .Include(m => m.Log.Where(c => c.Status == Status.Recieved)) .ToList();
这种写法会直接返回完整的document实体,且关联的Log集合仅包含状态符合要求的记录。
方案2:低版本兼容写法(投影查询)
如果无法升级ORM版本,可以用匿名类/自定义DTO投影的方式实现需求,EF会自动生成关联查询的SQL,性能和Include方案一致:
var Result = db.document .Select(d => new { Document = d, FilteredLogs = d.Log.Where(c => c.Status == Status.Recieved) }) .ToList() // 如果需要直接返回document实体,可以在内存中赋值 .Select(item => { item.Document.Log = item.FilteredLogs.ToList(); return item.Document; }) .ToList();
注意:如果你的项目配置了全局查询过滤,需要确保Log的全局过滤规则不会和你的自定义过滤条件冲突。
内容的提问来源于stack exchange,提问作者Rodrigo Loy
相关产品推荐
相关产品推荐

