为什么 asp.net Web API return 上的 GET 方法可 IQueryable?

Why does the GET method on asp.net Web API return IQueryable?

在 asp.net Web Api2 中,当您为具有 entity framework 的模型创建异步 Web api 控制器时,默认情况下,新控制器中的第一个方法如下所示:

 public IQueryable<MyModel> GetMyModel()
 {
     return db.MyModel;
 }

此方法的 JSON 输出只是所有 MyModel 条目的数组。同时,POST、PUT、GET(int id) 和 DELETE 的所有其他方法都标记为 async 和 return Task<IHttpActionResult>。为什么第一个 GET 方法不是同样的风格,像这样:

 public async Task<IHttpActionResult> GetMyModel()
 {
     return Ok(await db.MyModel.ToArrayAsync());
 }

我试过了,它产生了相同的 JSON 输出。

因为 Web API 无论如何都会具体化结果,所以生成所需的最少代码。

调用 ToArrayAsync() 实际上是在做不必要的工作,无论如何稍后都会为您完成。

它是 IQuerable,因为 API 调用者可以通过过滤器,这将被添加到您的 dBset 中,因此您将获得过滤后的数据。 我举一个例子。考虑您的 MyModal 有 3 个属性 Id、Name 和 Deleted。如果您的客户端应用程序需要所有行,只有未删除的行,那么您必须为此创建两个两个单独的操作。但是使用 IQuerable 可以减少它。

  1. 对于所有行:{host}/api/MyModal
  2. 对于未删除的行:{host}/api/MyModal?$filter(Deleted eq false)

可能还有更多过滤器,例如 top、skip、lineCount。即使您可以使用 IQureable 进行分页。 Web API 将像 Async 一样工作,因此需要显式地编写 Async。