C# EF Core查询:如何按子实体枚举条件过滤数据?
正确的EF Core查询写法
你的问题出在把筛选条件写进了Include/ThenInclude中——这两个方法仅用于加载关联实体数据,不能用来过滤主实体。要高效筛选出子实体满足条件的数据,需要在Where子句中添加过滤逻辑,同时保留Include来加载需要的关联数据。
情况1:TbElement的el是集合类型(ICollection)
如果每个TbElement对应多个TbEl,要筛选出至少有一个关联TbEl的ChildEl.Type为bottle的TbElement:
var elements = await _unitOfWork.Repository<TbElement>() // 加载关联的el及对应的ChildEl .Include(x => x.el) .ThenInclude(x => x.ChildEl) // 过滤条件:集合中存在符合要求的子实体 .Where(x => x.el.Any(el => el.ChildEl.Type == Type.bottle)) .ToListAsync();
情况2:TbElement的el是单个实体
如果每个TbElement仅对应一个TbEl,直接判断属性即可:
var elements = await _unitOfWork.Repository<TbElement>() .Include(x => x.el) .ThenInclude(x => x.ChildEl) // 空值保护:避免el或ChildEl为null时抛出异常 .Where(x => x.el?.ChildEl.Type == Type.bottle) .ToListAsync();
关键说明
- 这个查询会直接在数据库层面执行过滤和关联查询,比循环匹配ID的效率高很多
Include/ThenInclude确保查询结果中关联的el和ChildEl被预加载(避免延迟加载带来的N+1查询问题)
内容的提问来源于stack exchange,提问作者Migne
相关产品推荐
相关产品推荐

