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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:15:03