使用 linq 从 IdentityUser 列表中检索自定义配置文件数据

Posted

技术标签:

【中文标题】使用 linq 从 IdentityUser 列表中检索自定义配置文件数据【英文标题】:Retrieve custom profile data from IdentityUser list with linq 【发布时间】:2020-02-20 01:37:50 【问题描述】:

带有身份的 ASP.Net Core 3 MVC Web 应用程序

我的数据库上下文是

public class ApplicationDbContext : IdentityDbContext

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
    
etc...

因此,来自 IdentityUserContext 的用户是一个公共虚拟 DbSet,并被实例化为

DbSet 用户

但是,我定义了ApplicationUser : IdentityUser 来定义我自己的个人资料数据。

public class ApplicationUser : IdentityUser

    [Display(Name = "Is Manager")]
    public bool IsSupervisor  get; set; 
    etc....

所以,我在 startup.cs 中将服务配置为:

services.AddDefaultIdentity(options => options.SignIn.RequireConfirmedAccount = true)

我已将我的 UserManager 设置为

私有只读 UserManager _userManager

但是当我尝试使用 LINQ 根据我的自定义配置文件信息(在对控制器的记录“详细”调用中)使用 LINQ 访问和过滤用户记录时,我被告知这些自定义属性不可用:

        var managers = new List<SelectListItem>();
        managers.AddRange(_context.Users.Where(x => x.IsSupervisor == true).Select(manager => new SelectListItem
        
            Text = manager.DisplayName,
            Value = manager.Id.ToString()
        ).ToList());

        ViewBag.ManagersList = managers;

/Users/robert/Projects/mvc/Vacate/Controllers/EmployeesController.cs(59,59):错误 CS1061:“IdentityUser”不包含“IsSupervisor”的定义,并且没有可访问的扩展方法“IsSupervisor”接受可以找到“IdentityUser”类型的第一个参数(您是否缺少 using 指令或程序集引用?)(CS1061)(Vacate)

那么,在不使用单独的表来存储配置文件信息的情况下,有没有办法对访问您的自定义配置文件成员的用户使用 LINQ?将“演员”用户排序为 LINQ 调用中的正确 ApplicationUser 类型?或者我在设置 ApplicationUser 类以在 Identity 中使用时遗漏了什么?

【问题讨论】:

【参考方案1】:

你应该让你的默认ApplicationDbContext使用新的ApplicationUser

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    
    

更新您的数据库:Add-migrationUpdate-Database

【讨论】:

以上是关于使用 linq 从 IdentityUser 列表中检索自定义配置文件数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 从列表中删除特定项目

如何使用 LINQ 从对象列表中获取唯一的属性列表?

使用 Linq 从数字列表创建类列表 [重复]

无法从PasswordHasher登录种子的自定义IdentityUser

使用 Linq 从列表中获取所有匹配值的索引

从列表LINQ中提取列表[重复]