周二快乐!
我遇到了一个我似乎无法开始工作的问题。我正在尝试使用具有超过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>");
});
}
})
});
}
})
}
答案 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()
,它们将用于处理一批结果并在结果完全加载后执行任何最终任务。