使用CamlQuery和ListItemCollectionPosition

时间:2015-10-28 20:48:03

标签: sorting sharepoint paging caml csom

我使用CamlQuery和ListItemCollection实现分页,按名称字段对结果进行排序。我希望文件夹首先出现,就像在UI中一样,例如"文件夹A2,文件夹B2,文件A1,文件B1",而是我得到"文件A1,文件夹A2,文件B1,文件夹B2"。

完成此类排序和分页的最佳方法是什么?请注意,对于分页,我必须指定排序字段的值,该字段将是页面的第一个记录 - 我考虑将两个排序字段添加到CAML中,但我不确定是否可以使用两个ListItemCollectionPosition.PagingInfo中的字段。

我目前使用的代码是这样的:

var queryText = @"
   <View> 
       <Query> 
           <OrderBy Override='TRUE'> 
               <FieldRef Name='FileLeafRef' Ascending='True' />
           </OrderBy> 
       </Query> 
           ...
       <RowLimit> 
           10
       </RowLimit> 
   </View>";
var camlQuery = new CamlQuery();
camlQuery.ViewXml = queryText;
camlQuery.ListItemCollectionPosition = new ListItemCollectionPosition
    {
        PagingInfo = "Paged=TRUE&p_ID=1002&p_FileLeafRef=A1"
    };
var items = list.GetItems(camlQuery);

1 个答案:

答案 0 :(得分:2)

要获得按对象类型排序的结果,您可以使用FSObjType属性,例如,以下CAML表达式告诉服务器首先返回文件夹项,然后返回文件项:

<OrderBy Override='TRUE'> 
     <FieldRef Name='FSObjType' Ascending='False' />
</OrderBy>

关于ListItemCollectionPosition.PagingInfo属性,以下表达式告诉返回项目后面的项目,该项目具有通过p_ID参数指定的ID并按对象类型排序:

var camlQuery = new CamlQuery();
camlQuery.ListItemCollectionPosition = new ListItemCollectionPosition
{
   PagingInfo = "Paged=TRUE&p_FSObjType=1&p_ID=200"
}; 

示例

以下示例返回200项:

  • ,ID为100
  • 并按对象类型排序(文件夹项首先出现)

代码:

var itemsCount = 200;
var startItemId = 100;

var queryText = @"
<View> 
   <Query> 
       <OrderBy Override='TRUE'> 
           <FieldRef Name='FSObjType' Ascending='False' />
       </OrderBy> 
   </Query> 
   <RowLimit> 
       {0}
   </RowLimit> 
</View>";

 var camlQuery = new CamlQuery
 {
       ViewXml = string.Format(queryText, itemsCount),
       ListItemCollectionPosition = new ListItemCollectionPosition
       {
           PagingInfo = $"Paged=TRUE&p_FSObjType=1&p_ID={startItemId - 1}"
       }
 };
 var items = list.GetItems(camlQuery);
 ctx.Load(items);
 ctx.ExecuteQuery();    

更新

首先按类型排序,然后按名称排序的项目的PagingInfo表达式示例:

Paged=TRUE&p_FSObjType=1&p_FileLeafRef=B2&p_ID=100