【发布时间】:2021-02-15 19:17:24
【问题描述】:
假设您有一个变量databaseContext,并且想要从用户表中选择所有用户。来自文档
https://docs.microsoft.com/en-us/ef/core/querying/
你可以创建这个方法:
public IEnumerable<User> GetUsers() => _databaseContext.Users;
但这不是同步代码吗?我认为这是完全错误的:
public Task<User[]> GetUsers() => _databaseContext.Users.ToArrayAsync();
我希望有这样的方法:
public Task<IEnumerable<User>> GetUsers() => _databaseContext.Users /* but select them asynchronously */;
由于 EF Core 提供同步和异步方法,例如Find 和 FindAsync 我不知道如何异步查询所有数据。也许 EF Core 会以某种方式在后台执行此操作,但我应该等待它,对吧?
【问题讨论】:
-
您的
Task示例将在您等待时返回整个列表。您是否正在寻找像.AsAsyncEnumerable()...await foreach(...)这样的东西来处理返回的记录? -
目前我还没有用例。此方法应该只是从数据库中异步查询所有用户。我认为简单地使用
_databaseContext.Users会同步运行,所以它会冻结应用程序,不是吗? -
您的情况下的用户是一个 IQueryable,直到您在其上调用 ToList 或 foreach 之类的方法后才实现(同步或异步),此时其背后的表达式将转换为 sql 并执行.现在,这将取决于您实现它时使用的方法。 ToList vs ToListAsync 或 AsAsyncEnumerable 等。单独引用用户不会做任何事情(同步或异步)
-
啊好吧,所以
AsAsyncEnumerable不返回Task<IEnumerable<T>>所以我认为没有其他方法可以将返回类型更改为Task<List<T>>并调用它_databaseContext.Users.ToListAsync()?