SharePoint 2010 REST:getJSON&在列表中附加超过5,000条记录

时间:2017-01-24 16:01:21

标签: jquery json ajax sharepoint sharepoint-2010

周二快乐!

我遇到了一个我似乎无法开始工作的问题。我正在尝试使用具有超过5,000个项目的REST查询列表。我认为最好的方法是循环通过第一个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>");

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

1 个答案:

答案 0 :(得分:2)

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

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

我使用递归来使用REST API成功翻阅包含&gt; 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(),它们将用于处理一批结果并在结果完全加载后执行任何最终任务。