如何结合AspNetCore.Identity与MongoDb异步获取所有用户?
异步从AspNetCore Identity UserManager获取所有用户的解决方案
我们需要根据Identity的底层存储实现选择对应方案:
场景1:使用默认Entity Framework Core作为存储
ToListAsync是EF Core提供的IQueryable扩展方法,不属于UserManager本身的内置方法,使用前需要先引入命名空间 Microsoft.EntityFrameworkCore
正确实现代码如下:
[HttpGet] public async Task<ActionResult<IEnumerable<UserDto>>> GetAsync() { // 先异步查询所有用户,再做DTO映射 var users = await _userManager.Users.ToListAsync(); var userDtos = users.Select(user => user.AsDto()); return Ok(userDtos); }
注意:不要使用EF6的
System.Data.Entity命名空间,该命名空间下的扩展方法和AspNetCore不兼容。
场景2:使用MongoDb作为存储(如AspNetCore.Identity.MongoDbCore包)
该场景下没有EF Core的DbContext,也不需要引入EF相关的扩展包:
- 先引入MongoDB官方驱动的命名空间
MongoDB.Driver.Linq - 直接调用MongoDB驱动提供的
ToListAsync扩展方法即可,UserManager.Users在该实现下实际是IMongoQueryable<TUser>类型,原生支持Mongo的异步扩展
正确实现代码如下:
[HttpGet] public async Task<ActionResult<IEnumerable<UserDto>>> GetAsync() { var users = await _userManager.Users.ToListAsync(); var userDtos = users.Select(user => user.AsDto()); return Ok(userDtos); }
如果你的自定义Mongo Identity实现没有提供对应的扩展,也可以直接注入Mongo的IMongoCollection<TUser>实例,调用FindAsync查询所有用户:
public async Task<List<UserDto>> GetAllUsersAsync() { var filter = Builders<TUser>.Filter.Empty; var users = await _userCollection.Find(filter).ToListAsync(); return users.Select(u => u.AsDto()).ToList(); }
内容的提问来源于stack exchange,提问作者Jeff Dege
相关产品推荐
相关产品推荐

