如何计算 ASP.NET Core 2.0 中具有特定角色的所有用户
How to count all users with a specific role in ASP.NET Core 2.0
我正在使用 Identity 开发 Asp.net 核心 2.0 项目。我的项目使用核心 1.1 创建和开发,一段时间后迁移到核心 2.0。
迁移到核心 2.0 后,一切都很好,但在部分项目中,我需要让所有用户都具有特定角色。
在 Asp.Net Core 1.1 中,我使用以下代码获取所有特定角色的计数:
r.Users.Count
完成代码:
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);
}
和:
public class ApplicationRoleViewModel
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int NumberOfUsers { get; set; }
}
但是core 2.0中没有Users
对象。
我也看到了这个 但我无法解决我的问题。
现在我如何计算 ASP.NET Core 2.0 中具有特定角色的所有用户?
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 查询直接完成,但如果您不处理大量用户/角色,这个简单的解决方案应该可以正常工作。
如果您已经拥有自定义 IdentityRole
和 UserRole
模型,您应该能够添加允许您使用 IdentityDb.Roles.Include() 引用基于 RoleId 的 UserRoles 的属性.或者,您可以使用类似于下面的查询来执行自定义 sql 命令,该命令将 return 所需的信息。请记住,您的身份数据库的列或表在此处可能有所不同。
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)
});
}
}
}
如果 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 中的所有用户。
我正在使用 Identity 开发 Asp.net 核心 2.0 项目。我的项目使用核心 1.1 创建和开发,一段时间后迁移到核心 2.0。 迁移到核心 2.0 后,一切都很好,但在部分项目中,我需要让所有用户都具有特定角色。 在 Asp.Net Core 1.1 中,我使用以下代码获取所有特定角色的计数:
r.Users.Count
完成代码:
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);
}
和:
public class ApplicationRoleViewModel
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int NumberOfUsers { get; set; }
}
但是core 2.0中没有Users
对象。
我也看到了这个
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 查询直接完成,但如果您不处理大量用户/角色,这个简单的解决方案应该可以正常工作。
如果您已经拥有自定义 IdentityRole
和 UserRole
模型,您应该能够添加允许您使用 IdentityDb.Roles.Include() 引用基于 RoleId 的 UserRoles 的属性.或者,您可以使用类似于下面的查询来执行自定义 sql 命令,该命令将 return 所需的信息。请记住,您的身份数据库的列或表在此处可能有所不同。
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)
});
}
}
}
如果 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 中的所有用户。