带有 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>>
    }
}

奇怪的是,它似乎是按Projectclass的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