当我在[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
查询参数,否则它不应该自己进行任何排序。
答案 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。