我正在为我的Web Api使用OData服务来为我的客户端应用程序提供分页。这是我的一个控制器方法的代码。
// 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调用中使用任何OData协议时,如api / Category / all?$ skip&amp; $ top = 5它不会返回db中5-10个元素的确切顺序(即排序按主键= ID)。我可以通过对所有API调用使用$ orderby = ID来解决这个问题,但我想知道我是否可以避免它。我在这里做错了什么,因为默认情况下OData服务应该以与它们在db中相同的顺序返回吗?如果您有任何想法或建议,请告诉我。
由于
答案 0 :(得分:4)
默认情况下,我们按键属性对结果集进行排序,以确保存在稳定的排序(如果不是分页则会被破坏)。因此,看看你的模型是什么,比如DataAccess.Model.Category是什么样子会很有趣。 此外,如果您想自己进行稳定排序并禁用webapi推断顺序,则可以将ODataQuerySettings.EnsureStableOrdering(false)用于ApplyTo的其他重载,即
public virtual IQueryable ApplyTo(IQueryable query, ODataQuerySettings querySettings);
答案 1 :(得分:2)
除非客户要求,否则OData中的任何内容都不会强制执行特定的排序。 $ top和$ skip查询选项强制“一些稳定”排序,默认情况下(在.NET实现中)使用关键属性(主键)的排序,但如果你只是要求集合中的所有实体,服务将不强制任何排序(因为它不需要),因此将返回底层提供者给出的任何顺序(取决于DB等)。