SharePoint 2010 REST:获取 JSON 并追加到包含超过 5,000 条记录的列表

SharePoint 2010 REST: getJSON & Append on List with more than 5,000 records

周二快乐!

我遇到了一个问题,我似乎无法开始工作。我正在尝试使用 REST 查询包含 5,000 多个项目的列表。我认为最好的方法是循环第一个 0<>5000,然后循环另一个 >5000,然后附加我的结果,但我似乎无法让它工作。有人有这方面的经验吗?

function fnResidences(choice) {
        $.getJSON("../_vti_bin/ListData.svc/Residences?$expand=Country&$select=Country/Country,*$filter=(Id gt 0 and Id lt 5000) and (Country/Country eq '" + choice + "')", function (data) {
            if (data.d.results == 0) {

                $("#Residences-Table").html("N/A");

                } else {
                $("#Residences-Table").empty();

                    $.each(data.d.results, function (data) {

                    $("#Residences-Table").append("<tr><td>"+this.ResidenceName+"</td></tr>");

                        $.getJSON("../_vti_bin/ListData.svc/Residences?$expand=Country&$select=Country/Country,*$filter=(Id gt 5000) and (Country/Country eq '" + choice + "')", function (data) {

                            if (data.d.results == 0) {

                                $("#Residences-Table").html("N/A");

                                } else {

                                    $("#Residences-Table").empty();

                                    $.each(data.d.results, function (data) {

                                         $("#Residences-Table").append("<tr><td>"+this.ResidenceName+"</td></tr>");

                                    });
                                }
                       })
                });
            }
        })
    }

考虑使用分页。它归结为使用 $top$skip 参数分别指定要检索的项目数和要跳过的项目数。

您只需确保在 $orderby 参数中使用的列已编入索引。 (或者您可以使用 ID 字段,默认情况下已建立索引。)

我已经使用递归成功地使用 REST API 从一个包含超过 5000 个项目的列表中分页结果。下面示例中的递归 getNextBatch() 函数每次调用时最多检索 1000 个项目。

var endpointUrl = "/_vti_bin/ListData.svc/ListName";
$.getJSON(
    endpointUrl + "?$orderby=Id&$top=1000",
    function(data){
        processData(data); // you can do something with the results here
        var count = data.d.results.length;
        getNextBatch(count, processData, onComplete); // fetch next page 
    }
);

function getNextBatch(totalSoFar, processResults, onCompleteCallback){
    $.getJSON(
        endpointUrl + "?$orderby=Id&$skip="+totalSoFar+"&$top=1000",
        function(data){
            var count = data.d.results.length;
            if(count > 0){
                processResults(data); // do something with results
                getNextBatch(totalSoFar+count, callback); // fetch next page
            }else{
                onCompleteCallback();
            }
        }
    );
}

请注意,在上面的示例代码中不可见的是方法 processData()onComplete(),它们将用于处理一批结果并在结果完全加载后执行任何最终任务分别。