如何计算ASP.NET Core 2.0中具有特定角色的所有用户

时间:2018-04-20 16:47:45

标签: asp.net-core asp.net-core-2.0 identity

我正在使用Identity开发Asp.net核心2.0项目。我的项目使用核心1.1创建和开发,并在一段时间后迁移到核心2.0。 迁移到核心2.0后,一切都很好,但在项目的一部分,我需要让所有用户具有特定的角色。 在Asp.Net Core 1.1中,我使用此代码获取所有特定角色的计数:

navbar-toggler

完成代码:

<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="cart.php" href="cart.php"  aria-controls="navbarResponsive" aria-expanded="false"  aria-label="Toggle navigation">
    <i class="icono-navbar icon-shopping-cart"></i>
</button>

和:

r.Users.Count

但核心2.0中没有 public IActionResult Index() { List<ApplicationRoleViewModel> model = new List<ApplicationRoleViewModel>(); model = _roleManager.Roles.Select(r => new ApplicationRoleViewModel { Id = r.Id, Name = r.Name, Description = r.Description, NumberOfUsers = r.Users.Count }).ToList(); return View(model); } 对象。 我也看到这个question,但我无法解决我的问题。 现在我如何计算在ASP.NET Core 2.0中具有特定角色的所有用户?

2 个答案:

答案 0 :(得分:2)

UserRoles集合存储用户之间的所有引用以及它们所属的角色。你可以这样做:

var allUserRoles = _identityDb.UserRoles.ToList();
model = _roleManager.Roles.Select(r => new ApplicationRoleViewModel
{
    Id = r.Id,
    Name = r.Name,
    Description = r.Description,
    NumberOfUsers = allUserRoles.Count(ur => ur.RoleId == r.Id)
}).ToList();

请记住,这是非常低效的,因为它会对您的操作进行计数,而不是对数据库进行计数。理想情况下,这可以通过生成的SQL查询直接完成,但如果您没有处理大量的用户/角色,这个天真的解决方案应该可以正常工作。

如果您已经拥有自定义IdentityRoleUserRole模型,则应该能够添加允许您使用IdentityDb.Roles.Include()来引用基于RoleId的UserRoles的属性。或者,您可以使用类似于下面的查询来执行自定义sql命令,该命令将返回所需的信息。请记住,您的身份数据库的列或表可能会有所不同。

List<ApplicationRoleViewModel> vm = new List<ApplicationRoleViewModel>();

using (var dbConnection = _identityDb.Database.GetDbConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
    dbCommand.CommandText =
        @"SELECT 
            r.Id,
            r.Name,
            r.Description
            Count(ur.UserId)  as NumberOfUsers
        FROM AspNetRoles r
        FULL OUTER JOIN AspNetUserRoles ur ON r.Id = ur.RoleId
        GROUP BY r.Id, r.Name, r.Description";

    dbConnection.OpenAsync().Wait();
    using (var result = dbCommand.ExecuteReader())
    {
        while (result.Read())
        {
            vm.Add(new ApplicationRoleViewModel()
            {
                Id = result.GetString(0),
                Name = result.GetString(1),
                Description = result.GetString(2),
                NumberOfUsers = result.GetInt32(3)
            });
        }
    }
}

答案 1 :(得分:1)

如果正确配置了asp.net身份,您可以将UserManager和RoleManager注入您的控制器。

public class AccountController : Controller
{
    private UserManager<IdentityUser> userManager;
    private RoleManager<IdentityRole> roleManager;

    public AccountController(UserManager<IdentityUser> userMgr,
    RoleManager<IdentityRole> roleMgr) 
    {
      userManager = userMgr;
      roleManager = roleMgr;
    }
}

现在,您可以在userManager上调用GetUsersInRoleAsync(“myRole”),以便在您的操作方法中获取myRole中的所有用户。