gpt4 book ai didi

c# - WebAPI OData v4 查询不是异步的?

转载 作者:太空狗 更新时间:2023-10-29 23:53:41 26 4
gpt4 key购买 nike

我一直在四处寻找这个问题的答案,但我似乎找不到任何确定的答案。我们使用 OData v4,使用 ODataQueryOptions.ApplyTo 将 OData 选项应用于查询。我们还使用 ODataQuerySettings 来设置页面大小。当我们设置页面大小时,我们不能再对从 ODataQueryOptions.ApplyTo 返回的 IQueryable 使用 ToListAsync()。错误消息表明 IQueryable 的提供者不再来自 Entity Framework。

我发现这是因为在使用 pagesize 时,OData 通过将 IQueryable 传递给 TruncatedCollection 来解析它。此 TruncatedCollection 从数据库中检索所有 (pagesize + 1) 结果,以检查是否有超过 pagesize 个结果。但是,ApplyTo 不是异步方法,因此我可以放心地假设此数据库查询不是异步执行的。

我可以做些什么来确保查询是异步执行的吗? OData 团队肯定已经想到了这一点?还是让它保持同步就可以了?在我看来,如今异步 IO 几乎是必需的,因为我们希望我们的 API 能够很好地扩展,而不是在等待 IO 时阻塞所有线程。

感谢您的帮助!

编辑 1:

我被要求提供一些代码来解释我的意思。

在 BaseController.cs 中:

public class BaseController : ODataController
{
private static readonly ODataQuerySettings DefaultSettings = new ODataQuerySettings() { PageSize = 60 };


protected Task<IHttpActionResult> ODataResult<T>(IQueryable<T> query, ODataQueryOptions<T> options)
{
IQueryable result = options.ApplyTo(query, DefaultSettings);
return Task.FromResult(ODataOk(result));
}
}

在 CustomerController.cs 中:

public class CustomerController : BaseController
{
ICustomerService customerService;

public async Task<IHttpActionResult> Get(ODataQueryOptions<Customer> options)
{
var query = customerService.Query();
return await ODataResult(query, options);
}
}

不过正如我上面所说,问题出在 ApplyTo 的底层代码中。这是 OData 本身的一种方法。线路:

    IQueryable result = options.ApplyTo(query, DefaultSettings);

已经执行数据库查询,因为我们在 DefaultSettings 中定义了一个页面大小。定义页面大小会导致 ApplyTo 中的基础代码从数据库中检索所有数据,然后将检索到的列表作为可查询的列表返回。这意味着在同步函数中查询数据库。

所以,我的问题是:有没有办法在不放弃异步读取的情况下实现对 OData 的分页?还是我在尝试这样做时过于复杂了?

最佳答案

可以在不放弃异步读取的情况下在 OData 中实现分页。分页基本上意味着将一个表达式应用到 IQueryable 实例。调用 IQueryable.Take 后,可以调用 IQueryable.ToListAsync(枚举实际上会发生)。

但是 Microsoft Web Api OData v4 实现使得查询枚举同步发生。参见 here . ODataQuerySettings.ApplyTo 方法在内部使用 TruncatedCollection。 TruncatedCollection 继承自 System.Collections.Generic.List 并且在创建时将 IQueryable 构造函数参数传递给 List 的 constructor。它接受 IEnumerable,对其进行迭代并复制到内部数组中。

因此,您可以 fork Web Api OData(因为它是开源的),对其进行调整并使其异步。或者实现您自己的异步 ODataQuerySettings.ApplyTo 版本。

关于c# - WebAPI OData v4 查询不是异步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35918918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com