在 ASP.NET core 3.0 中,当我应用 except() 方法时出现以下异常

Posted

技术标签:

【中文标题】在 ASP.NET core 3.0 中,当我应用 except() 方法时出现以下异常【英文标题】:In ASP.NET core 3.0, I get the following exception when I apply the Except() method 【发布时间】:2020-02-28 18:40:36 【问题描述】:

InvalidOperationException:处理 LINQ 表达式'Except

我正在使用 ASP.NET core 3.0 中的身份系统来制作网站。我有一个用户列表,其中一些被分配了角色。基本上,我正在尝试获取未分配给特定角色的用户列表。

我实现这一点的方法是让所有用户减去那些已经分配到某个角色的用户。我正在尝试在 except() 方法的帮助下做到这一点。以下是我的操作方法的基础知识:

[HttpGet]
public async Task<IActionResult> AddUsersToRole(string roleName)

    IdentityRole role = await roleManager.FindByNameAsync(roleName);
    if (role != null)
    
        IList<ApplicationUser> usersInRole = await userManager.GetUsersInRoleAsync(role.Name);
        IQueryable<ApplicationUser> usersNotInRole = userManager.Users.Except(usersInRole);
        List<AddUsersToRoleViewModel> models = new List<AddUsersToRoleViewModel>();

    // Exception is thrown here...
    // Copy data to ViewModel
    foreach (var user in usersNotInRole)
    
        models.Add(new AddUsersToRoleViewModel  UserId = user.Id );
    

    return View(models);

当我尝试从 usersNotInRole 对象读取数据时引发异常。即使我删除 ViewModel 并将 usersNotInRole 对象传递给 View,我仍然会收到异常。有任何想法吗?我是编程新手。

【问题讨论】:

【参考方案1】:

查询提供程序无法将 linq 表达式转换为查询。

foreach 处引发异常,因为那是枚举并针对源执行查询的时候。

使用AsEnumerable 将用户加载到内存中。

var usersNotInRole = userManager.Users.AsEnumerable().Except(usersInRole);

【讨论】:

@Sea_Ocean 考虑到您只需要 Id,您应该对 Users 和 usersInRole 执行 Select(x => x.Id) 以减少从数据库中获取的数据量。 @ckuri 感谢您指出这一点。我会在我的所有代码中做到这一点。它也更具可读性。

以上是关于在 ASP.NET core 3.0 中,当我应用 except() 方法时出现以下异常的主要内容,如果未能解决你的问题,请参考以下文章

深入研究 Angular 和 ASP.NET Core 3.0

属性路由在 asp.net core 3.0 中无法正常工作

出站请求在一段时间后挂在ASP.NET Core 3.0应用程序中

具有 ASP.NET Core 3.0 和 EF Core 的多租户应用程序

如何在 ASP NET CORE 3.0 中获取当前登录的用户 ID?

ASP.NET CORE 3.0 Jquery Ajax请求成功有时不在同一视图中执行