【问题标题】:OData not setting all expand when using $inlinecount使用 $inlinecount 时 OData 未设置全部展开
【发布时间】:2015-08-06 17:46:28
【问题描述】:

我在 WebAPI 控制器中使用 MS 的 OData 3。

我的控制器如下所示:

public override IEnumerable<WorkOrderModel> Get(ODataQueryOptions<WorkOrderModel> options)
{
    Int64? totalCount;
    var results = _workOrders.Get(options, out totalCount);

    options.ApplyTo(results.AsQueryable());

    return new PageResult<WorkOrderModel>(results,
        Request.ODataProperties()
               .NextLink,
        totalCount);
}

然后我运行这个查询: /odata/WorkOrders?$expand=ItemSerial

我得到正确的结果,所有 WorkOrder 都会给我正确的 ItemSerial。

但是当我运行这个时: /odata/WorkOrders?$expand=ItemSerial&amp;$inlinecount=allpages

只有部分工作订单会有项目序列号。这不是随机的,总是相同的,但我想不出一个模式。

我必须使用ApplyTo,否则我将永远无法从 OData 获得扩展。

如果我检查var results,那么我可以看到所有结果都有一个ItemSerial,但在options.ApplyTo(results.AsQueryable()); 之后,大多数结果都设置为null。

ODataQueryOptions 中是否存在已知错误?

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

    我认为您应该尝试以下代码:

    var queryResult = options.ApplyTo(results.AsQueryable());
    

    您可能会发现即使您删除了$expand=ItemSerial,您的工作订单总是展开,因为您没有使用ApplyTo 函数的结果。

    【讨论】:

    • 我试过了,但即使这样也不好。我设法将它追踪到 OData 框架中的一个函数,它计算集合的结果,但同时破坏了所有包含。我现在手动设置 TotalCount 它可以工作。
    【解决方案2】:

    MS 的 OData 中存在错误。您可以通过在执行ApplyTo 之前手动将ResultCount 设置为一个数字来防止这种情况发生。

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 1970-01-01
      • 2012-05-29
      • 2012-07-03
      • 2013-03-25
      • 2013-03-03
      • 2014-08-04
      • 1970-01-01
      • 2017-07-06
      相关资源
      最近更新 更多