我是微软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; }