You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:20:04