带有 PageSize 的 EnableQueryAttribute 弄乱了预排序列表
EnableQueryAttribute with PageSize messes up pre-sorted list
当我在 WebAPI 2.2
中的 ApiController
方法上设置 [EnableQuery]
属性时,它似乎破坏了响应的顺序。
[ResponseType(typeof(IEnumerable<Project>))]
[Route("api/user/{userId}/project")]
[EnableQuery(PageSize = 100)]
public async Task<HttpResponseMessage> GetForUser(string userId)
{
// This gets all projects for the user, and sorts by the last access date
IEnumerable<Project> projects = await this.projectOperations.GetProjectsForUser(userId);
return this.Request.CreateResponse(HttpStatusCode.OK, projects);
}
我在没有任何 OData 查询参数的情况下调用它,生成的项目列表是 89 项,所以在我看来它根本不应该处理数组。
我已经验证实际上是 EnableQueryAttribute
通过创建一个新的 class 派生自 EnableQueryAttribute
:
public class TestEnableQueryAttribute : EnableQueryAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
// Here the response content is
// ObjectContent<IEnumerable<Project>>
base.OnActionExecuted(actionExecutedContext);
// Afterwards the response content is
// ObjectContent<System.Web.Http.OData.Query.TruncatedCollection<Project>>
}
}
奇怪的是,它似乎是按Project
class的Id
属性排序的。这是某种未记录的约定吗?
有人知道如何阻止它干扰我的排序吗?
我想要分页,但除非我实际指定一个 $orderby
查询参数,否则它不应该自己进行任何排序。
默认情况下,如果没有给出排序选项,Web API 将按主键(通常是 ID)排序,这样结果的顺序对于分页来说是稳定的。
您可以使用属性覆盖它以根据您返回的结果进行排序 - 使用 Microsoft.AspNet.OData
5.6.0 测试。
[EnableQuery(EnsureStableOrdering = false)]
在早期版本中,您可能需要自己调用 ODataQueryOptions
- 请参阅 http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options。
当我在 WebAPI 2.2
中的 ApiController
方法上设置 [EnableQuery]
属性时,它似乎破坏了响应的顺序。
[ResponseType(typeof(IEnumerable<Project>))]
[Route("api/user/{userId}/project")]
[EnableQuery(PageSize = 100)]
public async Task<HttpResponseMessage> GetForUser(string userId)
{
// This gets all projects for the user, and sorts by the last access date
IEnumerable<Project> projects = await this.projectOperations.GetProjectsForUser(userId);
return this.Request.CreateResponse(HttpStatusCode.OK, projects);
}
我在没有任何 OData 查询参数的情况下调用它,生成的项目列表是 89 项,所以在我看来它根本不应该处理数组。
我已经验证实际上是 EnableQueryAttribute
通过创建一个新的 class 派生自 EnableQueryAttribute
:
public class TestEnableQueryAttribute : EnableQueryAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
// Here the response content is
// ObjectContent<IEnumerable<Project>>
base.OnActionExecuted(actionExecutedContext);
// Afterwards the response content is
// ObjectContent<System.Web.Http.OData.Query.TruncatedCollection<Project>>
}
}
奇怪的是,它似乎是按Project
class的Id
属性排序的。这是某种未记录的约定吗?
有人知道如何阻止它干扰我的排序吗?
我想要分页,但除非我实际指定一个 $orderby
查询参数,否则它不应该自己进行任何排序。
默认情况下,如果没有给出排序选项,Web API 将按主键(通常是 ID)排序,这样结果的顺序对于分页来说是稳定的。
您可以使用属性覆盖它以根据您返回的结果进行排序 - 使用 Microsoft.AspNet.OData
5.6.0 测试。
[EnableQuery(EnsureStableOrdering = false)]
在早期版本中,您可能需要自己调用 ODataQueryOptions
- 请参阅 http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options。