我在 JavaScript 中有一个查询列表的方法。用户可以使用一些过滤器。 当我获取列表的所有项目时(当表单打开时),列表被正确检索。 但是,当我使用一些过滤器时,其中添加了一些“或”子句,我收到以下错误消息:
“请求失败。尝试的操作被禁止,因为它超过了管理员强制执行的 ListView 阈值”
查询似乎没有考虑我的行限制。在我执行导入数据的过程之前(在我对一些数据进行测试期间),这个查询运行良好。
这是我为执行操作而生成的 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>
有人可以帮我找到这个问题的解决方案吗(我试图为这些列创建索引,但它不起作用)。
最佳答案
你不能使用<Contains>
规避 ListView 阈值
<Contains>
操作不会从列索引中获益,因此无法帮助您规避 ListView 阈值(默认为 5000 项)设置的限制。
要解释为什么索引对“包含”操作没有帮助,请将索引想象成按标题的字母顺序在书架上排列书籍。 (这相当于对 Title 字段应用索引。)
您可以很快找到一本具有特定书名的书,因为您可以跳到您知道该书所在的位置。事实上,您只需要知道标题以开头就可以快速找到它。
但是,如果您只知道要查找的书名的一部分,会发生什么情况?除非您知道书名以该文本开头,否则找到这本书的唯一方法就是逐一查看每本书,一次查看一本书。
就像按字母顺序排列书籍并不能帮助您找到包含特定单词的书籍一样,<Contains>
CAML 中的元素不能利用列索引。 可以利用列索引的比较操作包括等式测试(<Eq>
、<Neq>
)、不等式比较(<Gt>
、<Lt>
、<Geq>
、<Leq>
)和<StartsWith>
.
备选方案:过滤准确的名称
如果您已将索引应用于 SuppCatName
和 SuppName
假设结果本身(在应用这些过滤器之后)不会超过 5000 个项目的 ListView 阈值,您的 CAML 查询中针对所有可能有效值的列、精确(<Eq>
)过滤器应该能够绕过 ListView 阈值。
如果出于业务原因这两列需要开放式,请考虑将确定子字符串值存储在不同的索引字段中,以便更好地进行过滤。
不幸的是,这不能是一个计算字段,因为它们不能被索引。但是,如果您不想强制用户手动输入新数据,您可以使用工作流根据 SuppCatName
中的值设置索引字段的值。和 SuppName
列。
建议:添加一个<OrderBy>
元素
<RowLimit>
的好处元素是它可以让你得到分页结果。这相当于说“给我第一个 x
个项目。”
但是,要使它有意义,您应该告诉 SharePoint 对结果进行排序。否则“前 x
项”是任意的(默认情况下可能按自动 ID 字段排序)。
关于javascript - SharePoint 列表不考虑 RowLimit CAML 标记 - JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41448192/