使用PageSize的EnableQueryAttribute会混乱预先排序的列表

时间:2015-04-09 15:53:43

标签: c# odata asp.net-web-api2

当我在[EnableQuery]中的ApiController方法上设置WebAPI 2.2属性时,它似乎打破了响应的顺序。

[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的新类来验证它实际上是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>>
    }
}

奇怪的是它似乎按Id类的Project属性对其进行排序。这是某种无证的惯例吗?

任何人都知道如何阻止它搞乱我的排序?
我想要分页,但除非我实际指定$orderby查询参数,否则它不应该自己进行任何排序。

1 个答案:

答案 0 :(得分:2)

默认情况下,如果没有给出排序选项,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