在处理SharePoint列表数据时,如果需要对查询结果进行排序和筛选,并且希望以分页的方式获取数据,那么编写一个高效的分页检索类就显得尤为重要。本文将介绍如何使用C#创建一个名为SPPagedListItemsRetriever
的类,该类可以指定SharePoint列表和查询条件,然后分页获取列表项。
首先,需要定义SPPagedListItemsRetriever
类,并在构造函数中初始化需要的SharePoint列表和查询对象。
public class SPPagedListItemsRetriever
{
private SPQuery _query;
private SPList _list;
private const int MaxRowLimit = 2000;
private static SPListItemCollectionPosition _emptySPListItemCollectionPosition = new SPListItemCollectionPosition(string.Empty);
public SPPagedListItemsRetriever(SPList list, SPQuery query)
{
_list = list;
_query = query;
}
// ...
}
接下来,定义两个公共方法:GetItems
用于获取指定范围内的列表项,GetTotalItemsCount
用于获取总项数。
需要注意的是,GetItems
方法在获取指定起始索引的项时,会先获取前199项然后丢弃,再开始获取所需的项。这种做法虽然可以工作,但效率不高。
public SPListItem[] GetItems(int? startIndex, int? maxRowsCount)
{
SPListItemCollectionPosition listItemCollectionPosition = null;
uint actualStartIndex = startIndex.HasValue ? (uint)startIndex.Value : 0;
// ...
}
GetTotalItemsCount
方法通过执行一个查询,返回查询结果的总数。这个方法同样需要优化,以避免不必要的数据加载。
public int GetTotalItemsCount()
{
SPQuery query = new SPQuery();
query.ViewFields = "";
query.Query = _query.Query;
// ...
}
为了提高效率,可以对GetItems
和GetTotalItemsCount
方法进行优化。例如,可以避免在获取起始索引项时加载不必要的数据,或者在获取总项数时只查询ID字段。
public SPListItem[] GetItems(int? startIndex, int? maxRowsCount)
{
// ...
if (actualStartIndex > 0)
{
SPQuery dummyQuery = new SPQuery();
dummyQuery.ViewFields = "";
dummyQuery.Query = _query.Query;
if (null != _query.Folder)
dummyQuery.Folder = _query.Folder;
int gotDummyItems = 0;
do
{
dummyQuery.RowLimit = Math.Min((uint)(actualStartIndex - gotDummyItems), MaxRowLimit);
if (null == listItemCollectionPosition)
listItemCollectionPosition = _emptySPListItemCollectionPosition;
dummyQuery.ListItemCollectionPosition = listItemCollectionPosition;
SPListItemCollection items = _list.GetItems(dummyQuery);
gotDummyItems += items.Count;
listItemCollectionPosition = items.ListItemCollectionPosition;
}
while (gotDummyItems < actualStartIndex && listItemCollectionPosition != null);
}
// ...
}