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

C# LINQ问题:如何过滤ThenInclude关联的指定操作员数据?

加载Anfragen时过滤关联职位(仅保留指定操作员的有效职位)

问题核心

直接使用Include+ThenInclude会加载所有关联职位,包括未分配操作员的记录,且无法直接在ThenInclude中过滤子级数据,需要通过EF Core的过滤包含(Filtered Include)或投影来实现精准筛选。


方案1:EF Core 5.0+ 推荐使用过滤包含(Filtered Include)

EF Core 5及以上版本支持在Include的集合关联上直接添加Where条件,既可以过滤关联的职位,也能同时过滤职位下的操作员:

// 替换"指定操作员ID"为实际的操作员ID参数
var targetAnfrage = Anfragen
    .Include(x => x.Nav_Positionen
        // 过滤出关联了指定操作员的职位,自动排除未分配操作员的职位
        .Where(p => p.Nav_AVBearbeiter.Any(b => b.操作员ID == 指定操作员ID))
    )
    .ThenInclude(x => x.Nav_AVBearbeiter
        // 进一步过滤职位下的操作员,仅保留指定目标
        .Where(b => b.操作员ID == 指定操作员ID)
    )
    .First(x => x.AnfrageID == V_PARAM_ID);

说明

  • Nav_Positionen.Where(...)直接筛选符合条件的职位,未分配操作员的职位因Nav_AVBearbeiter.Any(...)返回false会被排除
  • 后续ThenInclude的过滤确保仅加载目标操作员的关联数据,避免冗余

方案2:EF Core 5.0以下版本 使用投影(Projection)

旧版本EF不支持过滤包含,需通过手动投影构造实体对象,仅选择需要的字段和符合条件的关联数据:

var targetAnfrage = Anfragen
    .Where(x => x.AnfrageID == V_PARAM_ID)
    .Select(x => new Anfragen
    {
        // 复制请求头需要的所有字段,例如:
        AnfrageID = x.AnfrageID,
        AnfrageName = x.AnfrageName,
        ErstellDatum = x.ErstellDatum,
        // ...其他请求头字段
        
        // 过滤并投影关联职位
        Nav_Positionen = x.Nav_Positionen
            .Where(p => p.Nav_AVBearbeiter.Any(b => b.操作员ID == 指定操作员ID))
            .Select(p => new AnfragenPosNr
            {
                // 复制职位表需要的所有字段,例如:
                PosNrID = p.PosNrID,
                ArtikelNr = p.ArtikelNr,
                // ...其他职位字段
                
                // 过滤并投影关联的操作员
                Nav_AVBearbeiter = p.Nav_AVBearbeiter
                    .Where(b => b.操作员ID == 指定操作员ID)
                    .ToList()
            })
            .ToList()
    })
    .FirstOrDefault();

说明

  • 需手动复制实体的所有必要字段,适合无法升级EF版本的场景
  • 投影方式会直接从数据库查询筛选后的数据,性能更优

内容的提问来源于stack exchange,提问作者rkn53940

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:57:41