我们有一个包含50.000项的SharePoint列表,并希望从中获取一些数据,而不会禁用SP2010的默认限制。
从MSDN关于处理大型列表的文章中,我们认为关键因素是在SPQuery上使用一个小的RowLimit,并使用ListItemCollectionPosition进行批处理。
但是,使用我们这样的代码(某些东西),仍会触发限制异常:
SPQuery query = new SPQuery();
query.Query = "<Where><Contains><FieldRef Name=\"MatterName\" /><Value Type=\"Text\">7476922</Value></Contains></Where>";
query.ViewFields = "<FieldRef Name=\"MatterName\"/>";
query.RowLimit = 10;
int index = 0;
do
{
SPListItemCollection batch = mattersList.GetItems( query );
query.ListItemCollectionPosition = batch.ListItemCollectionPosition;
}
while ( query.ListItemCollectionPosition != null );
根据SharePoint Connections 2010的MVP专家的说法,这是按设计,因为结果集上的隐式排序仍会触发5000项限制阈值。
哪个好,所有,但是我们从这个列表中获取的方式是什么?使用ContentIterator会更好吗?如果是这样,内容迭代器将实现这一目标的神奇之处是什么呢?
答案 0 :(得分:3)
您可以使用:
query.QueryThrottleMode = SPQueryThrottleOption.Override;
以超级用户身份执行查询。
答案 1 :(得分:2)
作为管理员,而不是开发人员,我没有适合您的代码解决方案 - 但确实有2个无代码“解决方案”供您考虑。
这些设置均在Web应用程序级别进行调整
答案 2 :(得分:2)
您的<Where>
子句中使用的字段需要编入索引。
设置索引字段也需要在限制之外进行。例如,您有一个全新的列表,设置索引的列将通过。但是,一旦该列表的项目数超过限制阈值,设置新索引将失败,因为限制也适用于添加索引。
答案 3 :(得分:2)
您可以使用ContentInterator帮助访问大型列表中的5,000多个项目,而无需达到列表限制限制并接收SPQueryThrottleException。
ContentIterator实现了一种回调模式,用于对查询进行分段,以便一次处理单个项目。如果您需要处理可能超出限制限制的大量项目,请考虑使用此功能
答案 4 :(得分:2)
ContentIterator解决方案有一个例外:如果你的列表被索引(这是必需的),如果索引有超过5000行(基于Central Admin),你甚至会在contentIterator实例之前得到一个限制异常开始浏览内容。