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

C#中关联子实体条件筛选问题:Include添加Where未生效怎么办?

问题原因及解决办法

你的写法存在问题:EF Core 里 Include 搭配 Where 过滤子集合的逻辑,在使用 AutoMapper 的 ProjectTo 投影时不会生效。因为 Include 是用来将关联实体加载到 EF 的跟踪实体对象中的,而 ProjectTo 是直接生成 SQL 将数据映射到 DTO,这时候 Include 的过滤条件会被忽略,所以子实体仍会返回全部数据。

正确的两种解决方式

方式1:在AutoMapper映射配置里指定子集合过滤

先在 AutoMapper 的 Profile 配置类中,给父实体到 DTO 的映射规则加上子集合的过滤条件:

CreateMap<Parent, ParentDto>()
    .ForMember(dest => dest.Child, 
        opt => opt.MapFrom(src => src.Child.Where(a => a.Start == "123")));

之后查询时无需再写 Include,直接使用 ProjectTo 即可:

_outputList = Mapper.ProjectTo<ParentDto>(
    ParentService.GetAllParentsQuery()
        .Where(x => x.FieldId.HasValue && x.FieldId == "123")
).ToList();

方式2:直接在查询中手动投影过滤

如果不想修改 AutoMapper 配置,也可以直接在查询的 Select 语句里手动构造 DTO,同时对子集合做过滤:

_outputList = ParentService.GetAllParentsQuery()
    .Where(x => x.FieldId.HasValue && x.FieldId == "123")
    .Select(x => new ParentDto
    {
        // 映射父实体的其他字段,示例:
        Id = x.Id,
        FieldId = x.FieldId,
        // ...补充其他需要的父实体字段
        Child = x.Child.Where(a => a.Start == "123")
            .Select(c => new ChildDto
            {
                // 映射子实体的字段,示例:
                Id = c.Id,
                Start = c.Start,
                ParentId = c.ParentId
                // ...补充其他需要的子实体字段
            }).ToList()
    })
    .ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:25:43