• 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;
                    }
  • 相关阅读:
    本周总结
    本周总结
    本周总结
    本周总结
    性能分析(4)
    大型网站高性能架构
    第二天大数据清洗
    性能分析(2)
    六大质量属性——性能分析(1)
    java设计模式9-代理模式
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Web_API_Query_Paging_Data.html
Copyright © 2020-2023  润新知