You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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相关的扩展包:

  1. 先引入MongoDB官方驱动的命名空间 MongoDB.Driver.Linq
  2. 直接调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:15:01