我在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选项)。
那么,为什么这件事发生这样的事情,我该如何解决它?