2

这是我的带有 ODATA 操作的 ODATA 控制器。

   public class MyController : ODataController
{
    private readonly Repository_repo;

    public MyController(IRepository repo)
    {
        _repo = repo;
    }

    [EnableQuery(PageSize = 10, EnsureStableOrdering = false)]
    public IActionResult Get()
    {
        var data = _repo.GetData();
        return Ok(data)

    }

}

这是我的存储库方法。

   public IQueryable<DataModel> GetData() => _db.DbSet.Select(data=> new DataModel
    {
        // Implement model
    }).

现在我明白了将 repo 中的 GetData 方法设置为异步是没有意义的,因为这只是返回一个可查询的,直到您将其称为枚举器时才会执行。

所以做异步的部分是动作方法。我如何使它成为异步等待调用?据我所知,Odata EnableQuery 方法需要一个 IQueryable 。

4

2 回答 2

1

你不需要。action 方法只是请求管道的一部分;它不是异步的并不排除管道中的其他事物是异步的。处理 OData 查询的中间件实际上是将查询发送到数据库,并且很可能是异步执行的(我不熟悉源代码,无法明确说明)。无论如何,如果您实际上正在执行异步操作,则您的操作只需要异步。否则,不要担心。

于 2019-02-08T16:30:37.473 回答
0

通过将 IQueryable 转换为 AsyncEnumerator 使您的存储库实现 IAsyncEnumerable:

public class RepositoryOfDataModel : IAsyncEnumerable<DataModel>
{
  ...
  public IAsyncEnumerator<DataModel> GetAsyncEnumerator(CancellationToken cancellationToken = default)
    => ((IAsyncEnumerable<DataModel>)this.GetData()).GetAsyncEnumerator(cancellationToken);
  ...
}

现在你可以让你的控制器异步了:

public class MyController : ODataController
{
  private readonly Repository _repo;

  public MyController(IRepository repo)
  {
    _repo = repo;
  }

  [EnableQuery(PageSize = 10, EnsureStableOrdering = false)]
  public async Task<ActionResult<IEnumerable<DataModel>>> Get()
  {
    return await _repo.DataModels.ToListAsync();
  }
}
于 2021-12-08T13:31:51.630 回答