我需要检索特定角色的所有用户,我认为这应该是直截了当的,但是,这就是问题所在。
ApplicationUser的角色导航属性不是角色列表(IdentityRole),而是(IdentityUserroles)的集合,用于链接用户和角色的中间表。所以,这是我的代码,但它不起作用。
[HttpPost]
[Authorize(Roles = "Admin, Recepcionista, Orientador")]
public ActionResult SearchResults(SearchCriteriaViewModel criteria)
{
List<SearchResultViewModel> results = new List<SearchResultViewModel>();
var clients = new List<ApplicationUser>();
using (var context = new ApplicationDbContext())
{
IdentityUserRole role = new IdentityUserRole();
var tempRole = (from _role in context.Roles
where _role.Name == "client"
select _role).FirstOrDefault();
role.Role = tempRole;
clients = (from client in context.Users
where client.Email.Contains(criteria.SearchCriteria)
|| client.FirstName.Contains(criteria.SearchCriteria)
|| client.MiddleName.Contains(criteria.SearchCriteria)
|| client.LastName.Contains(criteria.SearchCriteria)
|| client.SecondLastName.Contains(criteria.SearchCriteria)
|| client.UserName.Contains(criteria.SearchCriteria)
&& client.Roles.Contains(role)
select client).ToList();
}
foreach (var client in clients)
{
results.Add(new SearchResultViewModel()
{
Email = client.Email,
FirstName = client.FirstName,
MiddleName = client.MiddleName,
LastName = client.LastName,
SecondLastName = client.SecondLastName,
UserName = client.UserName
});
}
SearchClientViewModel model = new SearchClientViewModel();
model.SearchResults = results;
return View("Index", model);
}
Linq抛出以下异常
发生了'System.NotSupportedException'类型的异常 mscorlib.dll但未在用户代码中处理
其他信息:无法创建类型的常量值 'Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole'。只要 在此上下文中支持原始类型或枚举类型。
如何做到这一点,为什么导航属性不是角色的集合,这可能是我们需要报告的错误吗?
答案 0 :(得分:2)
错误信息非常明确:您无法在收集非原始对象时调用Contains
。
请尝试以下操作:
clients = (from client in context.Users
where client.Email.Contains(criteria.SearchCriteria)
|| client.FirstName.Contains(criteria.SearchCriteria)
|| client.MiddleName.Contains(criteria.SearchCriteria)
|| client.LastName.Contains(criteria.SearchCriteria)
|| client.SecondLastName.Contains(criteria.SearchCriteria)
|| client.UserName.Contains(criteria.SearchCriteria)
&& client.Roles.Select(r => r.Name).Contains("client")
select client).ToList();
答案 1 :(得分:0)
我非常确定Identity Framework中有一个API可以这样做。但是对于您的例外情况,请尝试:
&& client.Roles.Count(r => r.Name == "client") > 0