如何在带有 C# 插件的 Dynamics CRM 组织中使用 Dynamics 365 Web API 检索所有记录(超过 5000 and/or 超过 1 页)?

How can I retrieve all records (more than 5000 and/or more than 1 page) with the Dynamics 365 Web API in a Dynamics CRM organization with a C# plugin?

我需要计算所有 Task 记录的 regardingobjectid 特定 Accountstatecode 0。这需要使用 Microsoft Dynamics CRM 2016 随附的新 365 Web API 和 REST 来完成。以下是使用 Javascript:

完成基本查询(无分页)的方式
var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/tasks?$filter=_regardingobjectid_value eq 00000000-0000-0000-0000-000000000000 and  statecode eq 0", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"*\",odata.maxpagesize=5000");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 200) {
            var results = JSON.parse(this.response);
            for (var i = 0; i < results.value.length; i++) {
                var activityid = results.value[i]["activityid"];
            }
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send();

此外,这必须以允许它检索超过 5000 条记录的方式完成。有关如何执行此操作的信息可在此处找到:https://msdn.microsoft.com/en-us/library/gg334767.aspx

这是我如何使用 C# 插件和 FETCH 查询最多 5000 条记录的方法 XML:

int count = 0;
            string fetchTemplate =
                @"<fetch version='1.0' output-format='xml - platform' mapping='logical' distinct='false'>
                    <entity name='activitypointer'>
                        <attribute name='activitytypecode' />
                        <attribute name='subject' />
                        <attribute name='prioritycode' />
                        <attribute name='regardingobjectid' />
                        <attribute name='statecode' />
                        <attribute name='instancetypecode' />
                        <attribute name='community' />
                        <attribute name='scheduledend' />
                        <attribute name='activityid' />
                        <filter type='and'>
                            <condition attribute='isregularactivity' operator='eq' value='1' />
                            <condition attribute='statecode' operator='eq' value='0' />
                        </filter>    
                        <link-entity name='account' from='accountid' to='regardingobjectid' alias='ab'>
                            <filter type='and'>
                                <condition attribute='accountid' operator='eq' uitype='account' value='{0}' />
                            </filter>
                        </link-entity>
                    </entity>
                </fetch>";
            fetchTemplate = String.Format(fetchTemplate, entityId.ToString());
            List<Entity> records = context.RetrieveAll(fetchTemplate);
            if (records != null && records.Count > 0)
            {
                count = records.Count;
            }

如有任何帮助,我们将不胜感激。我正在使用 Microsoft Dynamics CRM Online 2016、Visual Studio Professional 2015、相关的 Nuget 包和插件注册工具。

我来 Whosebug 寻求帮助,因为我找不到一个简单的在线 REST 查询示例,用于 Microsoft Dynamics CRM,它可以在 C# 插件中检索超过 5000 条记录。

我对@odata.nextlink 属性 以及它如何实现 restful 检索多个页面(可能超过 5000 条记录)特别感兴趣。

如果您愿意帮助我增强当前的 C# 插件代码,使其能够检索超过 5000 条记录,我们将不胜感激。

您不需要检索所有记录来执行计数。 FetchXML 包括允许我们计算最大值、最小值、平均值和 COUNT 的聚合。下面是统计系统所有账户的例子:

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

WebAPI 有一个 $count 查询选项,但不幸的是,它也受到同样的限制,所以在这种情况下没有帮助:

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.

那么,在介绍了这么多之后,我们如何计算使用WebAPI 的记录数并避免5000 条记录的限制呢?将我们的 FetchXML 作为 GET 中的查询传递给 WebAPI,this 就是如何使用它。在对前面的 FetchXML 示例进行编码后,我们得到了以下请求:

GET/api/data/v8.2/accounts?fetchXml=%3Cfetch+version%3D%221.0%22+mapping%3D%22logical%22+aggregate%3D%22true%22%3E%3Centity+name%3D%22account%22%3E%3Cattribute+name%3D%22accountid%22+aggregate%3D%22count%22+alias%3D%22count%22+%2F%3E%3C%2Fentity%3E%3C%2Ffetch%3E+

这是我们计数的响应:

如果您仍想检索所有记录,here您可以找到有关如何将分页 cookie 与 WebAPI 结合使用的示例。