EF Core中使用Include结合Where查询单个子分类及其所属主分类时结果异常的问题
EF Core中使用Include结合Where查询单个子分类及其所属主分类时结果异常的问题
问题分析
你当前的写法逻辑走偏了——EF Core里Include方法中嵌套的Where是用来过滤主实体关联的子集合内容,而不是用来定位你要找的子实体本身。你现在从Level1Sets(主分类)出发查询,再用FirstOrDefault()取第一个主分类,这就导致:
- 当
id=1时刚好第一个主分类包含该子分类,结果看似正确; - 但
id=2/3时,第一个主分类可能根本没有对应id的子分类,于是返回的主分类不对,且子集合为空,完全不符合你的需求。
正确的查询方式
既然你的目标是获取单个子分类(Level2Set)及其所属的主分类(Level1Set),应该直接从子分类表入手,通过Include加载它的主分类导航属性,这样一次数据库查询就能得到你想要的结果:
// 直接查询指定ID的子分类,同时Include它所属的主分类 var targetSubCategory = dBcontext.Level2Sets .Include(l2 => l2.Level1Set) .FirstOrDefault(l2 => l2.Id == id.Value);
这样得到的targetSubCategory就是你要编辑的子分类,它的Level1Set属性就是对应的主分类,完全满足你的需求,而且只触发一次数据库查询。
额外说明
如果你非要从主分类表入手(不推荐,不符合你的业务目标),正确的写法应该是先筛选出包含指定子分类的主分类,再过滤子集合,但这种写法冗余且不符合你的需求:
var result = dBcontext.Level1Sets .Where(l1 => l1.Level2Sets.Any(l2 => l2.Id == id.Value)) .Include(l1 => l1.Level2Sets.Where(l2 => l2.Id == id.Value)) .FirstOrDefault();
但显然这种写法不如直接查子分类高效,而且返回的是主分类对象,不是你需要的子分类对象,完全没必要这么做。
备注:内容来源于stack exchange,提问作者ILIIA CHTEREV
相关产品推荐
相关产品推荐

