.NET EF Core中Automapper ProjectTo过滤失效问题排查
你的代码如下:
var taskDTOs = await _repo.GetQueryable<TaskStatus>() .Where(s => s.Tasks.Any(t => t.CompanyId == _userContext.CompanyId && t.UserId == _userContext.UserId)) .ProjectTo<GetTaskListDTO>(_mapper.ConfigurationProvider) .ToListAsync();
以下是几种可能导致Where条件完全失效的原因:
实体关联配置错误
检查TaskStatus和Task之间的导航关系是否正确配置。比如在EF Core中,是否在Task实体上设置了指向TaskStatus的正确外键,且在DbContext的OnModelCreating方法中配置了HasMany/WithOne这类关联规则。如果关联关系配置错误,EF Core无法生成正确的JOIN语句,s.Tasks.Any(...)的过滤逻辑就不会生效,相当于没有添加任何条件。_userContext的取值异常
确认_userContext.CompanyId和_userContext.UserId是否拿到了当前用户的真实有效值。比如这两个值如果是默认值(如0、null),而数据库中存在对应值为0的记录,就会导致条件匹配到大量无关数据。调试时可以打断点,查看这两个变量的实际取值是否符合预期。全局查询过滤器或拦截器干扰
如果你的DbContext给TaskStatus或Task设置了全局查询过滤器(比如HasQueryFilter),或者存在自定义查询拦截器,可能会覆盖或干扰当前的Where条件。比如全局过滤器强制返回全量数据,或者和当前条件逻辑冲突,导致最终查询忽略了你设置的过滤规则。ProjectTo映射配置问题
虽然ProjectTo通常在Where之后执行不会有问题,但如果GetTaskListDTO的映射配置存在特殊设置(比如手动指定查询字段时丢失了关联逻辑),可能会让EF Core无法正确将Where条件转换为SQL。可以临时去掉ProjectTo,直接查询TaskStatus列表,验证过滤是否生效,以此排除映射的问题。数据库数据异常
检查数据库中Tasks表的CompanyId和UserId字段值是否符合预期。比如是否存在数据的这两个字段被错误赋值,导致你的过滤条件意外匹配到了其他公司/用户的记录。可以直接在数据库中执行对应SQL(替换_userContext的实际值),查看查询结果是否正确。
内容的提问来源于stack exchange,提问作者Nour Mawla

