Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 使用CamlQuery和ListItemCollectionPosition将文件夹放在分页结果的第一位_Sorting_Sharepoint_Paging_Caml_Csom - Fatal编程技术网

Sorting 使用CamlQuery和ListItemCollectionPosition将文件夹放在分页结果的第一位

Sorting 使用CamlQuery和ListItemCollectionPosition将文件夹放在分页结果的第一位,sorting,sharepoint,paging,caml,csom,Sorting,Sharepoint,Paging,Caml,Csom,我正在使用CamlQuery和ListItemCollection实现分页,按名称字段对结果进行排序。我希望文件夹排在第一位,就像在UI中一样,例如“文件夹A2、文件夹B2、文件A1、文件B1”,但我得到的是“文件A1、文件夹A2、文件B1、文件夹B2” 完成此类排序和分页的最佳方法是什么?请注意,对于分页,我必须指定排序字段的值,这将是页面的第一条记录–我考虑过在CAML中添加两个排序字段,但我不确定是否可以使用ListItemCollectionPosition.PaginInfo中的两个字

我正在使用CamlQuery和ListItemCollection实现分页,按名称字段对结果进行排序。我希望文件夹排在第一位,就像在UI中一样,例如“文件夹A2、文件夹B2、文件A1、文件B1”,但我得到的是“文件A1、文件夹A2、文件B1、文件夹B2”

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

我当前使用的代码如下所示:

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);
var queryText=@”
...
10
";
var camlQuery=新的camlQuery();
camlQuery.ViewXml=queryText;
camlQuery.ListItemCollectionPosition=新建ListItemCollectionPosition
{
pagininfo=“Paged=TRUE&p_ID=1002&p_FileLeafRef=A1”
};
var items=list.GetItems(camlQuery);

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

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

以下示例返回
200
项:

  • ID从
    100开始
  • 并按对象类型排序(首先是文件夹项)
代码:


问题是,我希望它们先按类型排序,然后按名称排序。我可以在CAML中按两个字段进行排序,但问题是如何处理分页-我不确定p_FSObjectType=1&p_FileLeafRef=A1是否能正确有效地解析-即,首先,按对象类型搜索,第二次按名称搜索,而不是相反,如果可能的话,使用索引。我正在尝试用C以外的语言进行此操作。您知道ListItemCollectionPosition字符串在执行此操作时发送的请求中的实际结束位置吗?
var camlQuery = new CamlQuery();
camlQuery.ListItemCollectionPosition = new ListItemCollectionPosition
{
   PagingInfo = "Paged=TRUE&p_FSObjType=1&p_ID=200"
}; 
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();    
Paged=TRUE&p_FSObjType=1&p_FileLeafRef=B2&p_ID=100