通过linq访问aspnet身份中的UserRoles表

时间:2015-11-18 14:01:17

标签: c# asp.net-identity

所以我可以访问User表,但我需要在linq语句中进一步查询以查看它们是否已添加到特定用户角色

var managers = (from a in db.Users 
                        join b in db.**UserRoles** on a.Id equals b.Id
                        where a.IsManager == true select a).ToList();

我知道您可以使用User.IsInRole通过html访问它,但我真的需要通过我的数据库调用来访问它

任何帮助都会很棒

2 个答案:

答案 0 :(得分:4)

鉴于您使用asp.net身份和代码优先方法?您可以单独访问用户或角色表(db.Users / db.Roles)。如果要访问用户的角色,可以执行db.Users.Roles。但是,这只会返回你角色的id(这里没有导航属性..)

要按角色名检查角色中的用户,可以将user.Roles与db.Roles一起加入,并检查db.Roles中的角色名称。像这样:

using (var db = new ApplicationDbContext())
{
    var user1 = new ApplicationUser { Email = "user1@test.com", UserName = "User #1"};
    var user2 = new ApplicationUser { Email = "user2@test.com", UserName = "User #2 - No Roles" };
    var role1 = new IdentityRole("SomeRole");
    db.Users.Add(user1);
    db.Users.Add(user2);
    db.Roles.Add(role1);
    db.SaveChanges();
    user1.Roles.Add(new IdentityUserRole { RoleId = role1.Id });
    db.SaveChanges();
    var usersInRole = db.Users.Where(u =>
        u.Roles.Join(db.Roles, usrRole => usrRole.RoleId,
        role => role.Id, (usrRole, role) => role).Any(r => r.Name.Equals("SomeRole"))).ToList();}
或者,您可以先获取角色,然后选中

var usersinRole = db.Users.Where(u => u.Roles.Any(r => r.RoleId.Equals(someRoleId)));

答案 1 :(得分:0)

根据您使用的版本,您应该有一些这样的表:

enter image description here

您需要加入角色表和角色表中的用户。