Dynamics 365 Web API分页查询数据

我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复396或者20200301可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

我们知道Dynamics 365 Web API查询数据既可以通过OData风格的表达式来查询,也可以通过FetchXml来查询,我这里分别说明如何分页查询。

1. 通过Web API OData风格的查询表达式来执行查询。

官方文档请参考: Web API Query Data Sample 的 Limit results 章节。如果只是获取查询的前N条的话,查询表达式加上 $top=n 即可,一次查询最多返回5000条记录,据我所知无法更改。

如果我一次按照createdon降序排列,一次查询10条记录呢?发起类似如下请求(Prefer: odata.maxpagesize=10 这个用来指定一次请求最多返回多少条记录,我们这里就是每页返回多少条记录),我这里加上了 $count 来返回符合查询条件的记录,当这个数据等于5000的时候很可能是结果超过5000行。

GET https://[Organization URI]/api/data/v9.0/contacts?$select=fullname,jobtitle,annualincome&$filter=contains(fullname,'(sample)')&$orderby=createdon desc&$count=true HTTP/1.1  
OData-MaxVersion: 4.0  
OData-Version: 4.0  
Content-Type: application/json; charset=utf-8  
Prefer: odata.maxpagesize=10

 

这个返回结果会包括 @odata.count 元素,该元素的值代表了符合条件的记录,还是说一下,如果等于5000不要相信只有5000条。

返回结果可能会包括@odata.nextLink 元素,如果该元素有值就代表还有更多符合条件的记录,查询下一页就是把这个元素值进行一个Get请求,类似如下:

                        var queryFilter = request.NextQueryStr.Substring(request.NextQueryStr.IndexOf('?') + 1);
                        var queryPolicyNextPage = await _CRMService.RetrieveMultiple("ly_demos", queryFilter, $"odata.maxpagesize={request.RecordsPerPage}");
                        var queryPolicyNextPageJson = JObject.Parse(queryPolicyNextPage.Content.ReadAsStringAsync().Result);
                        response.TotalRecords = Convert.ToInt32(queryPolicyNextPageJson["@odata.count"].ToString());
                        if (queryPolicyNextPageJson.ContainsKey("@odata.nextLink"))
                        {
                            response.NextPageNo = request.PageNo + 1;
                            response.NextQueryStr = queryPolicyNextPageJson["@odata.nextLink"].ToString();
                        }
                        else
                        {
                            response.NextPageNo = 0;
                        }

 

2.通过Web API执行FetchXml来执行查询。

官方文档请参考 Web API Query Data Sample 的 FetchXML pagination 章节 。通过指定 count来指定每页返回多少条记录,page属性来指定返回第N页,页码从1开始。如果要知道是否还有更多记录,需要为请求头指定 Prefer: odata.include-annotations="Microsoft.Dynamics.CRM.fetchxmlpagingcookie" 。

                if (includeFetchXmlPagingCookie)
                {
                    httpClient.DefaultRequestHeaders.Add("Prefer", "odata.include-annotations=\"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\"");
                }

 

然后就是检查返回的Json中是否有 @Microsoft.Dynamics.CRM.fetchxmlpagingcookie 元素,如果有就代表还有记录,否则就是最后一页了。

                var queryPolicy = await _CRMService.RetrieveMultipleUsingFetchXml("dyn_policyapplicationmembers", $"{fetchXml.ToString()}&$count=true", "", true, false);
                var queryPolicyJson = JObject.Parse(queryPolicy.Content.ReadAsStringAsync().Result);
                response.TotalRecords = Convert.ToInt32(queryPolicyJson["@odata.count"].ToString());
                if (queryPolicyJson.ContainsKey("@Microsoft.Dynamics.CRM.fetchxmlpagingcookie"))
                {
                    response.NextPageNo = request.PageNo + 1;
                }
                else
                {
                    response.NextPageNo = 0;
                }

 

posted @ 2020-03-01 17:16  微软MVP(15-18)罗勇  阅读(1070)  评论(0编辑  收藏  举报