Asp.net core mvc 扩展UserManager以包括按自定义字段ASP.net core进行的搜索

Asp.net core mvc 扩展UserManager以包括按自定义字段ASP.net core进行的搜索,asp.net-core-mvc,asp.net-identity,Asp.net Core Mvc,Asp.net Identity,我为ASP.net核心MVC应用程序的应用程序用户添加了名字、姓氏、地址、CardID等 我希望能够在UserManager类中添加额外的函数来搜索该数据库,以便根据这些额外的属性搜索用户 比如说 它已包含按名称(用户名)查找的函数 我希望能够找到用户对象的卡迪德 _userManager.FindByCardIDAsync("123456789") 或按地址选择多个用户 _userManager.FindByAddressAsync("123 Fake St. Real Town, USA"

我为ASP.net核心MVC应用程序的应用程序用户添加了名字、姓氏、地址、CardID等

我希望能够在UserManager类中添加额外的函数来搜索该数据库,以便根据这些额外的属性搜索用户

比如说 它已包含按名称(用户名)查找的函数

我希望能够找到用户对象的卡迪德

_userManager.FindByCardIDAsync("123456789")
或按地址选择多个用户

_userManager.FindByAddressAsync("123 Fake St. Real Town, USA")
我已经成功地使用了这个功能

ApplicationUser User = _userManager.Users.FirstOrDefault(u => u.CardID == CardID);
我仍然想了解扩展该类的方法,还是应该创建自己的类并从中继承?

怎么样?例如:

using System;
using System.Collections.Generic;
using System.Linq;
using ExampleProject.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using System.Threading.Tasks;

namespace ExampleProject
{
    public static class UserManagerExtensions
    {
        public static async Task<ApplicationUser> FindByNameAsync(this UserManager<ApplicationUser> um, string name)
        {
            return await um?.Users?.SingleOrDefaultAsync(x => x.UserName == name);
        }

        public static async Task<ApplicationUser> FindByCardIDAsync(this UserManager<ApplicationUser> um, string cardId)
        {
            return await um?.Users?.SingleOrDefaultAsync(x => x.CardID == cardId);
        }

        public static async Task<ApplicationUser> FindByAddressAsync(this UserManager<ApplicationUser> um, string address)
        {
            return await um?.Users?.SingleOrDefaultAsync(x => x.Address == address);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用ExampleProject.Models;
使用Microsoft.AspNetCore.Identity;
使用Microsoft.EntityFrameworkCore;
使用System.Threading.Tasks;
命名空间示例项目
{
公共静态类usermanager
{
公共静态异步任务FindByNameAsync(此UserManager um,字符串名称)
{
返回wait um?.Users?.SingleOrDefaultAsync(x=>x.UserName==name);
}
公共静态异步任务FindByCardIDAsync(此UserManager um,字符串cardId)
{
返回wait um?.Users?.SingleOrDefaultAsync(x=>x.CardID==CardID);
}
公共静态异步任务FindByAddressAsync(此UserManager um,字符串地址)
{
返回wait um?.Users?.SingleOrDefaultAsync(x=>x.Address==Address);
}
}
}
但请注意,这是一个简单的示例,只有在Name/cardd/Address是唯一的情况下才能很好地工作


我已经使用了
SingleOrDefaultAsync
作为保护,以防名称/CardID/Address不是唯一的-但我建议重新考虑一下。。。我想很难使地址唯一,所以也许您可以找到更好的标准,或者您将返回一组用户?

请注意,根据您的设计,如果
CardID
不是唯一的,那么在该上下文中使用“FirstOrDefault”可能会有问题?如果多个用户将具有相同的CardID/地址,您不想随机获得用户?CardID对于用户来说是唯一的,除了忘记将
Async
添加到
SingleOrDefault
并返回
Task
我喜欢这个!几乎试图为这一需求创建一个毫无意义的子类,而这一需求无疑会以某种方式陷入困境:-)
using System;
using System.Collections.Generic;
using System.Linq;
using ExampleProject.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using System.Threading.Tasks;

namespace ExampleProject
{
    public static class UserManagerExtensions
    {
        public static async Task<ApplicationUser> FindByNameAsync(this UserManager<ApplicationUser> um, string name)
        {
            return await um?.Users?.SingleOrDefaultAsync(x => x.UserName == name);
        }

        public static async Task<ApplicationUser> FindByCardIDAsync(this UserManager<ApplicationUser> um, string cardId)
        {
            return await um?.Users?.SingleOrDefaultAsync(x => x.CardID == cardId);
        }

        public static async Task<ApplicationUser> FindByAddressAsync(this UserManager<ApplicationUser> um, string address)
        {
            return await um?.Users?.SingleOrDefaultAsync(x => x.Address == address);
        }
    }
}