我正在尝试执行一个包含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.
答案 0 :(得分:0)
有一个ToListAsync
方法可以异步调用以获取数据。
var list = await db.Accounts.Where(x => true).ToListAsync();
获取数据需要花费大量时间,因此异步不是在Where
方法上,而是在诸如ToArrayAsync
或FirstAsync
这样的获取数据的方法上。
答案 1 :(得分:0)
Where
子句实际上不执行任何操作,而是推迟执行。您可以仅将FirstAsync
,ToListAsync
或ToArrayAsync
与Where
一起使用。
在代码中,您应该删除AsQueryable()
部分。没有它,你应该没事:
await _context.Set<TEntity>().Where(selector).ToArrayAsync();
是的,您应该使用Expresion
而不是Func
。 DbSet
或DbContext
可能不会为接受Where
的{{1}}提供重载。实际上,这很普遍。