我们有一个包含 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会是更好的选择吗?如果是这样,内容迭代器会发挥什么魔力来实现这一点?