是OData IQueryable异步的吗?

时间:2019-06-21 17:57:58

标签: c# asp.net-core entity-framework-core odata

我正在开发OData端点,以从数据库中返回项目列表。

我要返回IQueryable,并让前端通过odata查询选项处理查询/过滤/扩展/分页。

请考虑以下方法:

[ODataRoute]
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IActionResult Get() {
    return Ok(context.Vendors.AsQueryable());
}

我知道实际上并不需要async,因为这里没有具体查询。

在这种情况下,查询何时实现?

是以异步方式完成的吗?

2 个答案:

答案 0 :(得分:1)

您问了几个问题,我会尽力回答所有问题并澄清一些问题。

  

我知道确实不需要异步

从未真正需要异步,问题是异步将使您的应用程序受益。例如,当对DbContext进行调用时,有些网络操作会花费一些时间。如果在此期间不使用异步,则线程将等待响应,而不是返回线程池来处理其他请求。

是的,它不是必需的,但可能很有用。

  

在这种情况下,查询何时实现?

当访问端点时,查询将在中间件中实现。

  

是以异步方式完成的吗?

否,当您传递Queryable时,您只是将执行推迟到以后仍然可以同步完成,您需要使用async / await模式才能异步执行某事

答案 1 :(得分:0)

您的查询将在序列化过程中实现。访问您的方法时,要以JSON返回响应,序列化程序将尝试序列化结果。那时,您的查询实际上命中了数据库并返回了结果。 由于未应用任何过滤器,并且您的查询试图从数据库中检索所有记录,因此该应用程序可能运行缓慢。