SharePoint列表不考虑RowLimit CAML标记 - JavaScript

时间:2017-01-03 16:39:02

标签: javascript sharepoint office365

我在JavaScript中有一个查询列表的方法。用户可以使用一些过滤器。 当我获取列表中的所有项目时(表单打开时),检索列表是正确的。 但是,当我使用一些过滤器时,其中一些"或"条款已添加,我收到以下错误消息:

"请求失败。禁止尝试的操作,因为它超出了管理员强制执行的列表视图阈值"

似乎查询没有考虑我的行限制。在我执行导入数据的过程之前(在我的测试中使用一些数据),此查询运行良好。

这是我为执行操作而生成的XML:

<View>
   <Query>
      <Where>
         <And>
            <Eq>
               <FieldRef Name="AppvdSuppName" />
               <Value Type="Text">Non Approved Prime Supplier</Value>
            </Eq>
            <Or>
               <Contains>
                  <FieldRef Name="SuppCatName" />
                  <Value Type="Text">unit 7</Value>
               </Contains>
               <Contains>
                  <FieldRef Name="SuppName" />
                  <Value Type="Text">unit 7</Value>
               </Contains>
            </Or>
         </And>
      </Where>
   </Query>
   <RowLimit>30</RowLimit>
</View>

有人可以帮我找到解决这个问题的方法(我尝试为这些列创建索引,但它不起作用)。

1 个答案:

答案 0 :(得分:2)

您无法使用<Contains>来规避列表视图阈值

<Contains>操作不会受益于列索引,因此不会帮助您绕过列表视图阈值(默认为5000项)的限制。

要解释为什么索引对“包含”操作没有帮助,请考虑索引,例如按标题按字母顺序在书架上排列书籍。 (这相当于将标记应用于标题字段。)

你可以很快找到一本带有特定标题的书,因为你可以跳到你知道这本书的位置。实际上,您只需要知道标题开头即可快速找到它。

但是如果你只知道你正在寻找的书的一部分,会发生什么?除非你知道标题以该文字开头,否则找到这本书的唯一方法就是每次看一本书。

就像按字母顺序排列书籍无法帮助您查找包含某些单词的书籍一样,CAML中的<Contains>元素无法利用列索引。 可以利用列索引的比较操作包括等式测试(<Eq><Neq>),不等式比较(<Gt><Lt>,{{ 1}},<Geq>)和<Leq>

替代方案:过滤确切名称

如果您已对<StartsWith>SuppCatName列应用了索引,则CAML查询中针对所有可能有效值的精确(SuppName)过滤器应该能够绕过列表视图阈值,假设结果本身(应用这些过滤器后)不会超过5000项的列表视图阈值。

如果出于商业原因需要将这两列打开,请考虑将确定子字符串值存储在可以更好地过滤的不同索引字段中。

不幸的是,这不能是计算字段,因为那些不能被索引。但是,如果您不想强制用户手动输入新数据,您可以使用工作流程根据<Eq>SuppCatName列中的值设置索引字段的值。

建议:添加SuppName元素

<OrderBy>元素的好处是它可以让你获得分页结果。这相当于说“给我第一个<RowLimit>项目。”

但是,为了使其有意义,您应该告诉SharePoint对结果进行排序。否则“第一个x项目”是任意的(默认情况下可能按自动ID字段排序)。