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
相关产品推荐
相关产品推荐

