EF核心DbContext异步在哪里

时间:2020-03-24 14:52:00

标签: c# entity-framework-core

我正在尝试执行一个包含WHERE作为异步函数的查询。就像使用FirstAsync操作一样,但是没有WhereAsync,所以我想知道是否有解决方法。

我有一个ApplicationRepository对象,该对象具有一个GetEntitiesAsync函数,我尝试过:

public async Task<IEnumerable<TEntity>> GetEntitiesAsync<TEntity>(Func<TEntity, bool> selector) where TEntity : class => 
            await _context.Set<TEntity>().Where(selector).AsQueryable().ToArrayAsync();

但是,这一行代码会引发异常:

System.InvalidOperationException: The source IQueryable doesn't implement IAsyncEnumerable<OneStopApp.Models.CustomForm>. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.

2 个答案:

答案 0 :(得分:0)

有一个ToListAsync方法可以异步调用以获取数据。

var list = await db.Accounts.Where(x => true).ToListAsync();

获取数据需要花费大量时间,因此异步不是在Where方法上,而是在诸如ToArrayAsyncFirstAsync这样的获取数据的方法上。

答案 1 :(得分:0)

Where子句实际上不执行任何操作,而是推迟执行。您可以仅将FirstAsyncToListAsyncToArrayAsyncWhere一起使用。

在代码中,您应该删除AsQueryable()部分。没有它,你应该没事:

await _context.Set<TEntity>().Where(selector).ToArrayAsync();

是的,您应该使用Expresion而不是FuncDbSetDbContext可能不会为接受Where的{​​{1}}提供重载。实际上,这很普遍。