EF Core中Include关联过滤后执行Select导致过滤规则失效问题
EF Core Filtered Include 配合投影操作失效的成因
- Filtered Include 以及常规的
Include/ThenInclude配置的生效范围仅限于直接返回实体的查询:当你省略Select直接返回User实体时,EF Core会按照你配置的过滤规则预加载符合要求的UserRoles关联数据,因此得到的是过滤后的结果。 - 当查询中添加了
Select自定义投影操作后,EF Core会完全忽略所有已配置的Include/ThenInclude规则,转而根据Select内部的逻辑生成SQL语句。你当前写法中Select内部访问u.UserRoles时没有附带r => r.Role.Category == 3的过滤条件,因此EF会关联所有的UserRoles数据,最终拼接出所有分类的角色名称。 - 如果你需要在投影中获取过滤后的角色数据,不需要保留之前的
Include/ThenInclude配置,直接把过滤逻辑写在投影内部即可,参考实现如下:
await context.Users.Where(u => u.userId == currentUserId) .Select(u=> new UserDTO() { UserDisplayName= u.Name, ListOfRoles = String.Join(",", u.UserRoles.Where(r => r.Role.Category == 3).Select(r => r.Role.DisplayName)) }).FirstOrDefaultAsync();
内容的提问来源于stack exchange,提问作者Constantin Dinu Vasiliu
相关产品推荐
相关产品推荐

