我正在ASP.NET Core-6 Web API中实现异步编程。
我有这个代码:
public async Task<IQueryable<Score>> GetExamScoreAsync(PagingFilter filter)
{
var examScores = _dbContext.Scores
.Where(m => (bool)m.Approval.IsFirstLevel == false)
.Where(x => string.IsNullOrEmpty(filter.SearchQuery)
|| x.Subject.ToLower().Contains(filter.SearchQuery.ToLower())
|| x.StartDate.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture).Contains(filter.SearchQuery.ToLower())
|| x.EndDate.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture).Contains(filter.SearchQuery.ToLower()))
.OrderByDescending(x => x.CreatedAt);
return examScores;
}
我收到这个警告:
严重性代码描述项目文件行禁止显示状态警告CS1998此异步方法缺少"wait"运算符,将同步运行。考虑使用'await'运算符来等待非阻塞API调用,或使用'await Task.Run(…('来执行CPUBound工作
当我在_dbContent.Scores之前添加wait时,我得到了以下错误:
错误CS1061"IOrderedQueryable"不包含"GetAwaiter"的定义,并且找不到接受"IOrderedQueryable"类型的第一个参数的可访问扩展方法"GetAwaite"(是否缺少using指令或程序集引用?(
我如何解决这个问题并在这里应用异步?
谢谢。
您没有调用返回Task
/Task<T>
的异步方法,因此没有什么可等待的(也没有合适的返回类型(。根据Artur在评论中的建议更新你的方法,或者再次调用以生成你想要的Task
(但你不需要async
,结果类型也不会是IQueryable<T>
(。一些简化的可能性:
public IQueryable<MyEntity> Get(...)
{
return dbContext.MyEntities
.Where(...);
}
public IAsyncEnumerable<MyEntity> Get(...)
{
return dbContext.MyEntities
.Where(...)
.AsAsyncEnumerable();
}
public Task<MyEntity[]> Get(...)
{
return dbContext.MyEntities
.Where(...)
.ToArrayAsync();
}
如果以后要以相同的方法使用异步操作的结果,则可以使用async
和await
:
public async Task<int> GetCount(...)
{
var entities = await dbContext.MyEntities
.Where(...)
.ToArrayAsync();
// obviously not efficient but to demonstrate
// how async/await is used
return entities.Length;
}