c# - OData 服务不返回项目在数据库中的默认顺序

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

我正在为我的 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 来解决这个问题,但我想知道我是否可以避免它。我在这里做错了什么因为默认情况下 OD​​ata 服务应该以与它们在数据库中相同的顺序返回吗?如果您有任何想法或建议,请告诉我。

谢谢

最佳答案

默认情况下,我们按 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/

相关文章:

c# - 如何在 Sql Server Agent 中设置年度作业

c# - 使用多个词典或一个大词典

asp.net - div 内的图片在 IE 中无法点击

ASP.Net 中继器项目命令没有被触发

asp.net - 为什么此页面重定向在 IE 中不起作用?

c# - 何时返回 IHttpActionResult 与对象

xml - 为什么我的 ASP.Net Core Web API Controller 不返回 XML?

c# - 用c#开发一个窗口的服务,用于将4个不同位置的数据备份到一个位置?

c# - C# HTTP PUT 请求代码的问题

angularjs - 在angularjs中填充动态控件