2015-11-05 27 views
2

我在ASP.NET Web API中使用OData是因为我想利用它的$ skip选项通过在客户端上使用它进行分页。但是,我面临一个问题,我不确定它是一个错误还是我做错了什么。OData在ASP.NET Web API中导致错误排序

我有以下方法:

[HttpGet] 
[Route("api/people")] 
[EnableQuery(PageSize = 10, AllowedQueryOptions = AllowedQueryOptions.Skip)] 
public IHttpActionResult GetAll() 
{ 
    // Declare a simple list of Person objects. 
    // Every Person object has only 3 properties - Id, Name and DateCreated. 
    var peopleList = new List<Person>(); 

    for (int i = 0; i < 50; i++) 
    { 
     // Create the list with example Person objects. 
     // Start from new Person() { Id = 1, Name = "Person #1", DateCreated = Tomorrow. 
     // Continue with Person() { Id = 2, Name = "Person #2", DateCreated = The Day After Tomorrow. 
     // Do this till i == 50. 
     peopleList.Add(new Person() 
     { 
      Id = (i + 1), 
      Name = "Person #" + (i + 1), 
      DateCreated = DateTime.Now.AddDays(i) 
     }); 
    } 

    // Get only those Person objects the Ids of which are prime numbers. 
    // Order the list by the most recently added, meaning the one that has a most recent DateCreated value. 
    var outputList = peopleList 
     .Where(p => p.Id % 2 == 0) 
     .OrderByDescending(p => p.DateCreated) 
     .ToList(); 

    // Return the list from the method. 
    return Ok(outputList); 
} 

所以,这样写我想到,如果我提出一个要求,以“API /人”,我将获得10个最近的(因为每页的= 10选项写入EnableQuery属性)具有主要ID的人员对象。但是,我得到的结果是:

[ 
    { 
     "id": 2, 
     "name": "Person #2", 
     "dateCreated": "2015-11-06T10:48:09.1224206+02:00" 
    }, 
    { 
     "id": 4, 
     "name": "Person #4", 
     "dateCreated": "2015-11-08T10:48:09.1224206+02:00" 
    }, 
    ... 
    { 
     "id": 20, 
     "name": "Person #20", 
     "dateCreated": "2015-11-24T10:48:09.1224206+02:00" 
    } 
] 

如果我排除这一行

[EnableQuery(PageSize = 10, AllowedQueryOptions = AllowedQueryOptions.Skip)] 

我得到正确的排序,但当然我得到了整套50个Person对象,不只是10如我所愿。

[ 
    { 
     "id": 50, 
     "name": "Person #50", 
     "dateCreated": "2015-12-24T10:56:55.7456064+02:00" 
    }, 
    { 
     "id": 48, 
     "name": "Person #48", 
     "dateCreated": "2015-12-22T10:56:55.7456064+02:00" 
    }, 
    ... 
    { 
     "id": 2, 
     "name": "Person #2", 
     "dateCreated": "2015-11-06T10:48:09.1224206+02:00" 
    } 
] 

我不想让客户订单的名单,我想的唯一一件事就是确保返回集合的最大尺寸为10个对象,并且客户端可以指定对象的数量被跳过(使用$ skip选项)。

那么,为什么这件事发生这样的事情,我该如何解决它?

回答

1

好的,我找到了解决方案here。好像我要补充EnableStableOrdering = false以我EnableQuery属性是这样的:

解决方案:

[EnableQuery(PageSize = 10, AllowedQueryOptions = AllowedQueryOptions.Skip, EnsureStableOrdering = false)] 

这里是EnableStableOrdering确实(从源代码获得):

摘要:

获取或设置一个值,该值指示查询构成是否在必要时改变原始查询以确保稳定的排序顺序。

返回:

true值表示在必要时 保证稳定的排序原始查询应该进行修改。假值表示 在不修改查询的情况下,可以认为排序顺序是稳定的。 确保稳定排序顺序的查询提供者应将此值设置为false。默认值是true。

由于该选项的默认值是,我不得不将其设置为