1

我想:如何从LINQ表达式获取数据库中某个角色的所有ApplicationUser列表?

  • ApplicationUsers谁在角色"NormalUser"任何人
  • 所有ApplicationUsers只只管理员列表清单。

我这样做:

// GET: ApplicationUsers 
public ActionResult Index() { 
    // if you are Admin you will get all users 
    if (User.IsInRole("Admin")) 
     return View(db.Users.ToList()); 
    //if you are somebody else(not Admin) you will see only list of NormalUsers 
    //HERE I GET ERROR 
    var list = db.Users.Where(x => UserManager.IsInRole(x.Id, "NormalUser")).ToList(); // here I get error 
    return View(list); 
} 

的UserManager内部代码上面是:UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));

但不幸的是我的LINQ expresiion不正确。我得到错误:

LINQ to Entities does not recognize the method 'Boolean IsInRole[ApplicationUser,String](Microsoft.AspNet.Identity.UserManager`2[WebApplication2.Models.ApplicationUser,System.String], System.String, System.String)' method, and this method cannot be translated into a store expression. 

问题:如何正确地了解谁是角色"NormalUser"用户列表?

+0

角色如何存储在应用程序用户中?它是每个用户的一个角色,还是一个用户可以属于多个角色?我会添加一个回答,看看它是如何为你做的。 – 2014-09-24 12:54:25

回答

4

UserManager.IsInRole函数在数据库中不受支持,但是如果您的应用程序可以承担在应用过滤器之前从数据库中拉回整个User表的权重,那么您可以在Users表之间添加一个ToList参考和您的Where过滤器,即

var list = db.Users.ToList().Where(x => UserManager.IsInRole(x.Id, "NormalUser")).ToList(); 
+5

这将加载内存中的所有用户 – 2014-09-19 16:55:13

+0

@EhsanSajjad它的工作,但我不知道为什么,我不知道这个解决方案的效率是怎么回事。在目前的情况下,最多有20个用户,但后来我不知道。 – Yoda 2014-09-19 16:56:18

+0

是的,这会加载内存中的所有用户。如果你是eBay,不要这样做。已经更新了解释和警告。 – stovroz 2014-09-19 16:58:21

-1

了解角色和应用程序用户的关系将会很有用。

如果用户只能属于一个角色,这将是罚款为你做这样的事情:

var list = db.Users.ToList().Where(x => x.Role == "NormalUser").ToList(); 

ID的用户可以是多个角色的一部分,它看起来会更喜欢这个:

var list = db.Users.ToList().Where(x => x.Roles.Contains("NormalUser")).ToList(); 

希望这会有所帮助。

+1

用户可以属于多个角色。但是,你的语句不会编译,因为'x.Role'不是一个字符串类型。需要成为'x.Roles.Any(s => s.RoleId == adminRole.Id)',如上面的答案。 – Matthew 2015-10-14 17:56:21

3

我在这里找到了一个很好的答案,但找不到一个。所以决定把我得到的任何其他访客来到这里。要获取任何特定角色的用户列表,可以使用此代码。

public async Task<ActionResult> Index() 
    { 
     List<ApplicationUser> appUsers=new List<ApplicationUser>(); 
     await Task.Run(() => 
     { 
      var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(db)); 
      var adminRole=roleManager.FindByName("Admin"); 
      appUsers = db.Users.Where(x => x.Roles.Any(s => s.RoleId == adminRole.Id)).ToList(); 
     }); 
     return View(appUsers); 
    } 
+0

如果你愿意硬编码角色ID,你可以跳过角色管理器部分(我真的不明白为什么不,为角色分配ID和名称似乎对我来说是多余的),否则这看起来是正确的方式去做吧。 – Matthew 2015-10-14 17:54:33