【问题标题】:$inlinecount not working on ApiController using ApplyTo$inlinecount 在使用 ApplyTo 的 ApiController 上不起作用
【发布时间】:2015-09-09 08:10:26
【问题描述】:

我正在尝试在标准 Web API 2.2 ApiController 中使用 OData 过滤和分页功能。为此,我必须重写请求 URL 以符合 OData v4 标准。我的控制器如下所示:

public GridPage Get([FromUri] GridSearchCriteria criteria)
{
    Request.RequestUri = ... // convert querystring to OData v4
    var context = new ODataQueryContext(MyEdmModel.Instance, typeof(Delivery), null);
    ODataQueryOptions<Delivery> options = new ODataQueryOptions<Delivery>(context, Request);

    IQueryable<Delivery> deliveries = ... // use EF to load deliveries from DB
    var result = (IQueryable<Delivery>)options.ApplyTo(deliveries); // BTW, I wonder why there is no generic overload of ApplyTo?

    // fill and return a GridPage
    ...
}

到目前为止,一切正常。

现在,我对过滤项目的总数感兴趣,因此我已将$inlinecount=allpages 添加到查询字符串中。生成的请求 URI 如下所示:

http://localhost:54026/.../deliveries/page?$top=10&amp;$skip=0&amp;$inlinecount=allpages}

然后,我尝试像这样检索总计数(在调用 ApplyTo 之后):

long? totalCount = Request.ODataProperties().TotalCount;

不幸的是,无论我尝试什么,totalCount 总是保持为空。我也试过使用:

object totalCount;
Request.Properties.TryGetValue("System.Web.OData.TotalCount", out totalCount);

但没有运气。查看Request 属性会发现System.Web.OData.Properties 下有一个条目,但它的所有属性都未初始化(Model 为空,NextLink 为空,TotalCount 为空,等等)。

有人知道为什么这不起作用吗?顺便说一句,我使用的是Microsoft.AspNet.OData v5.6。

【问题讨论】:

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


    【解决方案1】:

    我必须指定$count=true 而不是$inlinecount=allpages。根据https://damienbod.wordpress.com/2014/06/13/web-api-and-odata-v4-queries-functions-and-attribute-routing-part-2/ 的说法,这是某处的重大变化。

    【讨论】:

    • 这也适用于 ODataController。这记录太差了 - 谢谢!
    • 谢谢。当我迁移到 4.0 时,这有助于我进行其他规范更改:OData Version 4.0 Part 2: URL Conventions
    • 它适用于 OData V4,它的 inlinecount 被替换为 count,而不是 2 或 3,我在 ApiController 上遇到了同样的问题,inlinecount=allpages 不起作用,结果正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多