1

Я хочу получить:Как получить список всех ApplicationUsers, которые находятся в определенной роли из базы данных по выражению LINQ?

  • список ApplicationUsers, которые находятся в роли "NormalUser" никому
  • список всех ApplicationUsers только лишь Admins.

Я сделал это:

// 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

Каким образом роли хранятся у пользователя приложения? Это одна роль для каждого пользователя или может принадлежать одному пользователю к нескольким ролям? Я добавлю answe, посмотрим, как это для вас. –

ответ

4

Функция UserManager.IsInRole не поддерживается в базе данных, но если ваше приложение может нести вес вытягивания всей таблицы пользователя из базы данных до применения фильтра, вы можете просто добавить список ToList между таблицей пользователей ссылка и ваш фильтр где-то, например

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

это загрузит всех пользователей в памяти –

+0

@EhsanSajjad Это сработало, но я не знаю почему, и я не знаю, что происходит с эффективностью этого решения. В текущем сценарии будет не более 20 пользователей, но позже я не знаю. – Yoda

+0

Да, это загрузит всех пользователей в память. Не делайте этого, если вы eBay. Обновился с объяснением и предостережением. – stovroz

-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

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

Вы можете пропустить роль roleManager, если вы хотите просто скопировать идентификатор роли (я действительно не понимаю, почему нет, наличие отдельных идентификаторов и имен для ролей кажется излишним для меня), но в противном случае это кажется правильным способом сделать это. – Matthew