如何修改查询代码无需手动限制ReadByQuery的PageSize参数
问题根因
空返回和PageSize的数值本身没有关系,是代码逻辑错误导致的:
- 当返回数据量小于你设置的PageSize时,
result.NumRemaining会直接返回0,而你把数据序列化、返回的逻辑全写在了while (result.NumRemaining > 0)的循环块里,这种场景下循环不会触发,代码直接走到最后的return "",自然就返回空。 - 额外提一句,你原来的循环逻辑只设计为执行1次就返回,也完全没处理多分页拉取的需求,相当于分页逻辑是无效的。
修复方案
修改后不需要手动调整PageSize,不管数据量是否超过单页大小都能正常返回结果:
public static string Run(ILogger logger) { OnlineClient client = Bootstrap.Client(logger); ReadByQuery query = new ReadByQuery() { ObjectName = "CONTACT", PageSize = 1000, // 可以保留固定值,也可以直接删掉这行用第三方库默认分页大小,不需要随数据量调整 Fields = { "RECORDNO" } }; logger.LogInformation("Executing query to Intacct API"); Task<OnlineResponse> task = client.Execute(query); task.Wait(); OnlineResponse response = task.Result; Result result = response.Results[0]; LogManager.Flush(); // 先存储第一页返回的结果 List<dynamic> allData = JsonConvert.DeserializeObject<List<dynamic>>(JsonConvert.SerializeObject(result.Data)); // 循环拉取剩余分页数据 while (result.NumRemaining > 0 && !string.IsNullOrEmpty(result.ResultId)) { ReadMore more = new ReadMore() { ResultId = result.ResultId }; Task<OnlineResponse> moreTask = client.Execute(more); moreTask.Wait(); result = moreTask.Result.Results[0]; allData.AddRange(JsonConvert.DeserializeObject<List<dynamic>>(JsonConvert.SerializeObject(result.Data))); } // 统一返回所有数据 return JsonConvert.SerializeObject(allData); }
内容的提问来源于stack exchange,提问作者Java
相关产品推荐
相关产品推荐

