我在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>
有人可以帮我找到解决这个问题的方法(我尝试为这些列创建索引,但它不起作用)。
答案 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字段排序)。