【问题标题】:How to retrieve Users with a specific role via Linq in ASPnet Identity如何通过 ASPnet Identity 中的 Linq 检索具有特定角色的用户
【发布时间】:2014-02-11 10:54:26
【问题描述】:

我需要检索特定角色的所有用户,我认为这应该是直截了当的,但是,这就是问题所在。

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'。仅有的 在此上下文中支持原始类型或枚举类型。

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

【问题讨论】:

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


    【解决方案1】:

    错误信息很清楚:你不能在非原始对象的集合上调用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();
    

    【讨论】:

    • 无论如何,导航属性没有引导我们进入用户角色集合是否正确?
    • 您可以尝试使用 Include 方法来急切地加载导航属性。
    • 但是 IdentityUserRoles 的导航属性而不是 IdentityRoles。这让我很困惑
    • 当我们想使用包含时的完美解决方案!谢谢你的朋友。
    【解决方案2】:

    我很确定 Identity Framework 中有一个 API 可以做到这一点。但是对于您的例外,请尝试:

    && client.Roles.Count(r => r.Name == "client") > 0
    

    【讨论】:

    • 甚至:&& client.Roles.Any(r => r.Name == "client")
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2021-10-25
    • 2010-12-22
    • 2019-06-16
    相关资源
    最近更新 更多