我正在为我的 Web Api 使用 OData 服务来为我的客户端应用程序提供分页。这是我的 Controller 方法之一的代码。
// Get all Categories
[HttpGet]
[ActionName("all")]
public ODataResult<DataAccess.Model.Category> GetCategoryList(ODataQueryOptions options)
{
var categoryList = this.Repository.GetCategories().AsQueryable<Category>();
var results = (options.ApplyTo(categoryList) as IQueryable<DataAccess.Model.Category>);
long count = categoryList.Count();
if (count == 0)
count = 1; // throws up an ArgumentException error if the count is less than 1
return new ODataResult<DataAccess.Model.Category>(results, null, count);
}
但是当我在 api/Category/all?$skip&$top=5 等 api 调用中使用任何 OData 协议(protocol)时,它不会返回数据库中 5-10 个元素的确切顺序(即按他们的主键=ID)。我可以通过对我的所有 API 调用使用 $orderby=ID 来解决这个问题,但我想知道我是否可以避免它。我在这里做错了什么因为默认情况下 OData 服务应该以与它们在数据库中相同的顺序返回吗?如果您有任何想法或建议,请告诉我。
谢谢
最佳答案
默认情况下,我们按 key 属性对结果集进行排序,以确保排序稳定(否则分页会被破坏)。所以,看看你的模型是什么会很有趣,即 DataAccess.Model.Category 的样子。 此外,如果您想自己进行稳定排序并禁用 webapi 推断顺序,您可以将 ODataQuerySettings.EnsureStableOrdering (false) 用于 ApplyTo 的其他重载,即
public virtual IQueryable ApplyTo(IQueryable query, ODataQuerySettings querySettings);
关于c# - OData 服务不返回项目在数据库中的默认顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13578168/