OData IQueryable 是异步的吗?
is OData IQueryable async?
我正在为 return 数据库中的项目列表开发一个 OData 端点。
我正在 returning IQueryable
并让前端通过 odata 查询选项处理查询/过滤/扩展/分页。
考虑以下方法:
[ODataRoute]
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IActionResult Get() {
return Ok(context.Vendors.AsQueryable());
}
我知道 async
并不是真正需要的,因为这里没有具体化查询。
在此上下文中,查询何时具体化?
它是以异步方式完成的吗?
您的查询将在序列化期间具体化。当您的方法被访问时,return JSON 中的响应,序列化程序会尝试序列化结果。那时,您的查询实际上命中了数据库并得到了 returned 的结果。
应用程序可能会很慢,因为没有应用过滤器并且您的查询试图从数据库中检索所有记录。
你问了几个问题我会尽力回答所有问题并澄清几个问题。
I understand that async is not really needed
从来没有真正需要异步,问题是异步是否会使您的应用程序受益。例如,当对 DbContext 进行调用时,有一些网络操作需要时间,如果您在此期间不使用异步,则线程将等待响应,而不是 return 到线程池以处理其他请求。
所以是的,它不是必需的,但它可能会有用。
In this context, when is the query being materialized?
当端点被访问时,查询被具体化(在中间件中),
Is it being done in an asynchronous fashion?
不,当您传递 Queryable 时,您只是将执行推迟到稍后执行,这仍然是同步完成的,您需要使用 async/await 模式来异步执行某些操作
我正在为 return 数据库中的项目列表开发一个 OData 端点。
我正在 returning IQueryable
并让前端通过 odata 查询选项处理查询/过滤/扩展/分页。
考虑以下方法:
[ODataRoute]
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IActionResult Get() {
return Ok(context.Vendors.AsQueryable());
}
我知道 async
并不是真正需要的,因为这里没有具体化查询。
在此上下文中,查询何时具体化?
它是以异步方式完成的吗?
您的查询将在序列化期间具体化。当您的方法被访问时,return JSON 中的响应,序列化程序会尝试序列化结果。那时,您的查询实际上命中了数据库并得到了 returned 的结果。 应用程序可能会很慢,因为没有应用过滤器并且您的查询试图从数据库中检索所有记录。
你问了几个问题我会尽力回答所有问题并澄清几个问题。
I understand that async is not really needed
从来没有真正需要异步,问题是异步是否会使您的应用程序受益。例如,当对 DbContext 进行调用时,有一些网络操作需要时间,如果您在此期间不使用异步,则线程将等待响应,而不是 return 到线程池以处理其他请求。
所以是的,它不是必需的,但它可能会有用。
In this context, when is the query being materialized?
当端点被访问时,查询被具体化(在中间件中),
Is it being done in an asynchronous fashion?
不,当您传递 Queryable 时,您只是将执行推迟到稍后执行,这仍然是同步完成的,您需要使用 async/await 模式来异步执行某些操作