从User表查询嵌套UserRoles时如何获取List<UserRole>而非嵌套集合
问题原因
你当前的代码使用Select方法对每个ApplicationUser对象做映射,每个用户都会返回一个独立的List<UserRole>,所以最终得到的是「每个用户的角色列表」组成的集合,也就是IEnumerable<List<UserRole>>类型,和你需要的单层集合结构不符。
解决方法
把Select替换为SelectMany方法,它可以把多层嵌套的集合拍平成单层的序列,最后再调用ToList()就能得到你需要的List<UserRole>类型。
正确代码如下:
List<UserRole> userRoles = applicationUsers .SelectMany(person => person.UserRoles.Select(u => new UserRole { Id = u.RoleId, RoleName = u.Role.ToString(), })) .ToList();
可选优化方案
如果不需要保留全量的ApplicationUser数据做其他逻辑处理,可以直接在EF Core查询阶段就完成映射,不需要先把所有用户数据加载到内存再二次处理,性能更好:
List<UserRole> userRoles = await _userManager.Users .SelectMany(u => u.UserRoles.Select(r => new UserRole { Id = r.RoleId, RoleName = r.Role.ToString() })) .ToListAsync();
这种写法会让EF Core生成更精简的SQL,仅查询需要的RoleId和Role字段,不会返回多余的用户表字段。
内容的提问来源于stack exchange,提问作者10101
相关产品推荐
相关产品推荐

