OData服务不返回数据库中存在项的默认顺序

时间:2012-11-27 05:55:30

标签: c# asp.net asp.net-web-api odata

我正在为我的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中相同的顺序返回吗?如果您有任何想法或建议,请告诉我。

由于

2 个答案:

答案 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等)。