【问题标题】:SharePoint 2010 REST Large List CountsSharePoint 2010 REST 大型列表计数
【发布时间】:2016-06-22 01:20:43
【问题描述】:

在这里给你一个快速的问题。因此,我试图对列表项的数量进行 REST 计算,但该列表一次最多只能返回 1,000 个条目。我想我有一个解决方法,但我将如何添加这两个结果?

        $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$inlinecount=allpages", function (data) {
        $("#ALLCount1").text(data.d.results.length);
    })

    $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$inlinecount=allpages&$skiptoken=1016", function (data) {
        $("#ALLCount2").text(data.d.results.length);
    })

【问题讨论】:

    标签: jquery rest sharepoint sharepoint-2010


    【解决方案1】:

    项目总数

    如果您要查找列表本身中的项目总数(而不是过滤视图中的项目数),您可以直接访问列表的 $count 属性。

    "/_vti_bin/ListData.svc/MPIC/$count"
    

    这将返回项目计数。

    分页(如有必要)

    要使用 REST 模拟分页,您可以执行以下操作:

    1. 使用$skip=n 参数根据$orderby 参数跳过第一个n 条目
    2. 使用$top=n 参数根据$orderby$skip 参数返回顶部的n 条目。

    处理异步回调

    您的代码中最大的问题是您有两个异步函数回调,用于获取结果项的总和。由于这些函数调用不在同一范围内执行,因此您不能同时访问它们的值。

    一种解决方法是使用函数链接将您的逻辑向前移动到回调函数中。

    使用 $skip 和 $top 的示例

    这是一个使用$skip$top 参数和您提供的代码的示例,在更新ALLCount1 元素的文本之前使用递归回调函数获取结果总数。

    $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$orderby=Id&$top=1000&$inlinecount=allpages", function (data) {
        var count = data.d.results.length;
        updateTotal(count);
    });
    
    function updateTotal(total){
        $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$orderby=Id&$skip="+total+"&$top=1000&$inlinecount=allpages", function (data) {
            var count = data.d.results.length;
            if(count > 0){
                updateTotal(total+count);
            }
            else{
                $("#ALLCount1").text(total);
            }
        });
    }
    

    使用 $skiptoken 和 $top 的示例

    如果您受限于使用$skiptoken 而不是$skip(例如在查询包含 5000 多个项目的列表时),您肯定仍然可以使用它,但您还有更多工作要做。

    $skip 只想要跳过的项目数,$skiptoken 想要跳过最后一个项目的 ID。

    代码与上面的代码基本相同,但您需要深入研究数据结果并提取最后一项的 ID 值。我将把它作为练习留给读者。

    updateTotal(0,0);
    function updateTotal(skip,total){
        $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$orderby=Id&$skiptoken="+skip+"&$top=1000&$inlinecount=allpages", function (data) {
            var count = data.d.results.length;
            if(count > 0){
                var lastItemId;
                // TODO: get last item id from results here
                updateTotal(lastItemId,total+count);
            }
            else{
                $("#ALLCount1").text(total);
            }
        });
    }
    

    【讨论】:

      【解决方案2】:

      要获得总和,您可以尝试以下方法:

      var sum = 0;
      
      $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$inlinecount=allpages", function (data) {
          sum = data.d.results.length;
          $("#ALLCount1").text(sum);
          $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$inlinecount=allpages&$skiptoken=1016", function (data) {
              sum += data.d.results.length;
              $("#ALLCount2").text(sum);
          })  
      })
      

      虽然这有一些问题:

      1. 首先,为什么要跳到 1016?你不想要1001吗?
      2. 你这里只有两个电话。您打算如何检索 2001 年的记录?

      您可能想要做的是分页。也就是说,继续发送请求,直到没有记录返回。

      【讨论】:

      • 所以当我看第一个计数时。它有一个从 1016 开始的下一个。我认为是因为前 16 个文档被删除了所以它。分页将如何工作?我发现一些 cmets 提到它,但没有具体说明如何执行。
      • 您仍然希望将其限制为 1000,除非您知道始终删除了多少。最好将其限制为 1000,让它返回 984,并获得准确的计数。
      • this example 应该可以帮助您入门。它有一些需要修改的示例代码,但如果遇到问题,您可以发布另一个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 2018-01-25
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多