Ещё один способ получить большое количество данных – это использовать разбиение запроса на страницы, т.е. получение элементов списка порциями по несколько элементов.
Для этого надо указать объекту класса SPQuery значения для свойств ListItemCollectionPosition и RowLimit.
RowLimit – указывает сколько элементов списка необходимо получить.
Свойство ListItemCollectionPosition – это объект класса SPListItemCollectionPosition принимающий в конструкторе строковой параметр, в котором указано с какого элемента необходимо получить данные (точнее следующего за ним элемента). Выглядит это так: “Paged=TRUE&p_ID=5” – получить элементы после элемента с ID равным 5.
Например, сделаем такой метод:
private static SPListItemCollection GetPagedItems(SPList list, string pagingInfo, uint rowLimit)
{
var query = new SPQuery
{
RowLimit = rowLimit,
ListItemCollectionPosition = new SPListItemCollectionPosition(pagingInfo)
};
return list.GetItems(query);
}
Метод возвращает заданное количество элементов (rowLimit) из указанной страницы (pagintInfo).
Если в pagingInfo передавать пустую строку, то метод вернёт первую страницу.
Возвращаемые методом данные (типа SPListItemCollection) содержат в себе данные для получения следующей страницы – свойство ListItemCollectionPosition.
Таким образом, мы можем организовать постраничную загрузку и обработку элементов списка, например следующим образом (используя вышеприведённый метод):
using (var site = new SPSite("http://mysite/"))
{
using (var web = site.OpenWeb())
{
var list = web.Lists["TestList"];
var pagingInfo = string.Empty; //Здесь храним информацию о странице
var pageNumber = 1; //Номер страницы, для оформления вывода
SPListItemCollection items = null; //Полученные данные
do
{
if (items != null && items.ListItemCollectionPosition != null)
pagingInfo = items.ListItemCollectionPosition.PagingInfo; //Получаем данные о странице из предыдущего запроса
Console.WriteLine("Page {0}, Info '{1}'", pageNumber, pagingInfo);
items = GetPagedItems(list, pagingInfo, 5); //Получаем по 5 элементов
foreach (SPListItem item in items)
Console.WriteLine(item.Title);
Console.WriteLine();
pageNumber++;
} while (items.ListItemCollectionPosition != null);
}
}
Для моего списка результат выглядит следующим образом (консольное приложение):
