linq - 如何通过 ASPnet Identity 中的 Linq 检索具有特定角色的用户

标签 linq entity-framework asp.net-mvc-5 asp.net-identity

我需要检索特定角色的所有用户,我认为这应该很简单,但是,这里是问题所在。

ApplicationUser 的 Roles 导航属性不是角色列表(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 抛出以下异常

An exception of type 'System.NotSupportedException' occurred in mscorlib.dll but was not handled in user code

Additional information: Unable to create a constant value of type 'Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole'. Only primitive types or enumeration types are supported in this context.



这怎么做,为什么导航属性不是角色的集合,这可能是我们需要报告的错误吗?

最佳答案

错误信息很明确:你不能调用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();

关于linq - 如何通过 ASPnet Identity 中的 Linq 检索具有特定角色的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265031/

相关文章:

c# - 使用 LINQ 从字典中获取键值组合

c# - Linq-to-entities 中的 OrderBy、Select 和 Where 子句的顺序是否重要

javascript - 如何删除/重置window.onfocus功能?

c# - 获取不同的名称

c# - 将 IEnumerable<T> 转换为动态生成的对象的集合

c# - 需要为最大日期值构建表达式树

c# - 将 JSON 数据对象存储到 ASP.NET MVC( Entity Framework )中的数据库

c# - Entity Framework v4 - 来自链接服务器的简单存储过程 Select 语句(打开查询)返回 -1

forms-authentication - (Request.IsAuthenticated) 在使用 FormsAuthentication.SetAuthCookie(username,false) 后为假

c# - Sitecore:通过菜单项命令/消息传递语言信息