我正在使用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中具有特定角色的所有用户?
答案 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查询直接完成,但如果您没有处理大量的用户/角色,这个天真的解决方案应该可以正常工作。
如果您已经拥有自定义IdentityRole
和UserRole
模型,则应该能够添加允许您使用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中的所有用户。