【问题标题】:Counting ALL rows in Dynamics CRM Online web api (ODATA)计算 Dynamics CRM Online web api (ODATA) 中的所有行
【发布时间】:2019-01-03 17:49:58
【问题描述】:

是否可以计算给定实体中的所有行,绕过 5000 行限制并绕过页面大小限制?

我不想在一个请求中返回超过 5000 行,而只想计算给定实体中所有行的计数。

根据微软的说法,你不能在请求 URI 中这样做:

The count value does not represent the total number of entities in the system. 

It is limited by the maximum number of entities that can be returned.

我试过这个:

GET [Organization URI]/api/data/v9.0/accounts/?$count=true

还有其他方法吗?

【问题讨论】:

  • 嗯。这实际上并没有回答我的问题。我只是想数他们,有没有办法通过URI来做呢。
  • 这就是探索的想法,你最终会得到 5k 限制或 50k 限制 fetchxml..hihaj.com/…
  • 啊哈。我是否将 fetch XML 放在 URI 中?

标签: odata dynamics-crm dynamics-crm-online dynamics-crm-365 dynamics-crm-webapi


【解决方案1】:

使用函数RetrieveTotalRecordCount

如果要检索超过 5000 条实体的记录总数,请使用 RetrieveTotalRecordCount 函数。

您的查询将如下所示:

https://<your api url>/RetrieveTotalRecordCount(EntityNames=['accounts'])

【讨论】:

  • 它对我有用,只有一条评论,它会接受裸实体名称,所以account 不是accounts
【解决方案2】:

更新:

最新版本 v9.1 具有实现此功能的直接功能 - RetrieveTotalRecordCount

——————————————————————————————

不幸的是,我们必须选择其中一条路径来根据限制内的预期结果确定记录数。

1.如果少于 5000,请使用:(您已经尝试过)

GET [Organization URI]/api/data/v9.0/accounts/?$count=true

2。少于 50,000,使用这个:

GET [Organization URI]/api/data/v8.2/accounts?fetchXml=[URI-encoded FetchXML query]

超出限制会报错:AggregateQueryRecordLimit exceeded. Cannot perform this operation.

示例查询:

<fetch version="1.0" mapping="logical" aggregate="true">
  <entity name="account">
    <attribute name="accountid" aggregate="count" alias="count" />
  </entity>
</fetch>

用 URI 做一个浏览器地址栏测试:

[Organization URI]/api/data/v8.2/accounts?fetchXml=%3Cfetch%20version=%221.0%22%20mapping=%22logical%22%20aggregate=%22true%22%3E%3Centity%20name=%22account%22%3E%3Cattribute%20name=%22accountid%22%20aggregate=%22count%22%20alias=%22count%22%20/%3E%3C/entity%3E%3C/fetch%3E

解决此问题的唯一方法是根据某些属性对数据集进行分区,以便获得较小的记录子集以单独聚合。

Read more

3.最后的手段是遍历@odata.nextLink,并使用代码变量(code example to query the next page)计算每个页面中的记录

【讨论】:

  • 嗨 Arun,最后一个解决方案很好,但要求我请求所有行,这将是矫枉过正,因为我只对计数感兴趣。
  • 详细说明:我的目标是计算实体中的记录数量,然后将它们加载到数据库中。我需要确保在初始计数和插入数据库之间没有遗漏任何记录。
  • @uba2012 我同意它的矫枉过正,这就是为什么它最后的手段。您可以使用一些过滤器逐批进行,例如帐户以“A”、“B”然后“C”、“D”或基于创建的月份等开头。您也可以尝试捕获,每当插入失败时递增计数器。
  • 我使用了 fetchxml。我仍然对不使用 fetchxml 是不可能的感到惊讶。
  • @uba2012 整个社区都在等待 MS 提供直接服务方法来获得这个:)
【解决方案3】:

XrmToolBox 有一个counting tool 可以帮助解决这个问题。

此外,我们 MetaTools Inc. 刚刚发布了一个名为 AggX 的在线工具,它可以对 Dynamics 365 Online 组织中的任意数量的记录运行聚合,并且在测试版发布期间是免费的。

【讨论】:

    【解决方案4】:

    您可以尝试OData's $inlinecount 查询选项。 在查询字符串中仅添加 $inlinecount=allpages 将返回所有记录,因此在 URI 中添加 $top=1 以仅获取一条记录以及所有记录的计数。

    您的网址看起来像/accounts/?$inlinecount=allpages&amp;$top=1

    例如,click here 和响应 XML 将计数为 &lt;m:count&gt;11&lt;/m:count&gt;

    注意:此查询选项仅在 OData 2.0 版和 以上

    【讨论】:

    • 抱歉 OData v4 不支持
    【解决方案5】:

    这行得通:

    [组织 URI]/api/data/v8.2/accounts?$count

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多