首页 > 解决方案 > CSOM 查询分页文件结果

问题描述

试图弄清楚如何通过传递“page”和“pageSize”来更新以下代码以获取分页结果:

using (ClientContext spClientContext = new AuthenticationManager().GetACSAppOnlyContext(siteUrl, _clientId, _clientSecret))
{
    if (spClientContext != null)
    {
        CamlQuery camlQuery = new CamlQuery();

        camlQuery.ViewXml = "<View Scope="RecursiveAll">" +
            "<Query>" +
            "<Where>" +
            "<Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value></Eq>" +
            "</Where>" +
            "<OrderBy><FieldRef Name=\"FileLeafRef\" Ascending=\"FALSE\"/></OrderBy>" +
            "</Query>" +
            "<RowLimit>10</RowLimit>" +
            "</View>";

        List list = spClientContext.Web.Lists.GetByTitle("Documents");

        ListItemCollection listItems = list.GetItems(camlQuery);

        spClientContext.Load(listItems,
                             items => items.Include(
                                 item => item.DisplayName,
                                 item => item.FileSystemObjectType,
                                 item => item.File,
                                 item => item.File.Name,
                                 item => item.File.Author,
                                 item => item.File.ModifiedBy,
                                 item => item.File.ListItemAllFields["Created"],
                                 item => item.File.ListItemAllFields["Modified"],
                                 item => item.File.ListItemAllFields["FileRef"],
                                 item => item.File.Length));

        spClientContext.ExecuteQuery();

        if (listItems != null && listItems.Count > 0)
        {
            foreach (ListItem item in listItems)
            {
                if (item.FileSystemObjectType.Equals(FileSystemObjectType.File))
                {
                    // Do Stuff
                }
            }
        }
    }
}

上面的代码将包含在“pageSize”将被传递给 CAML 查询“RowLimit”元素值的方法中。那是有效的。我对 SharePoint CSOM 开发人员还很陌生,所以现在想弄清楚如何设置页面或位置,以便我只能根据请求查询分页结果?谢谢您的帮助!

标签: c#asp.net-mvcsharepointcsomcaml

解决方案


RowLimit属性包含一个名为 的布尔属性Paged,其中默认值为FALSE。在RowLimit 元素 (List)中包含一些关于此的规范;但是,这是一个不平凡的实现,可能您需要使用do{...}while{...}循环来辅助您的任务,最终代码将类似于下面的示例:

    camlQuery.ViewXml = "<View Scope="RecursiveAll">" +
    "<Query>" +
    "<Where>" +
    "<Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value></Eq>" +
    "</Where>" +
    "<OrderBy><FieldRef Name=\"FileLeafRef\" Ascending=\"FALSE\"/></OrderBy>" +
    "</Query>" +
    "<RowLimit Paged='TRUE'>10</RowLimit>" +
    "</View>";

    List list = spClientContext.Web.Lists.GetByTitle("Documents");

    List<ListItem> listItemColl = new List<ListItem>();

    do
    {
     ListItemCollection listItems = list.GetItems(camlQuery);
     spClientContext.Load(listItems,
                     items => items.Include(
                         item => item.DisplayName,
                         item => item.FileSystemObjectType,
                         item => item.File,
                         item => item.File.Name,
                         item => item.File.Author,
                         item => item.File.ModifiedBy,
                         item => item.File.ListItemAllFields["Created"],
                         item => item.File.ListItemAllFields["Modified"],
                         item => item.File.ListItemAllFields["FileRef"],
                         item => item.File.Length));

     spClientContext.ExecuteQuery();
     context.Load(listItems);
        
         try
         {
         spClientContext.ExecuteQuery();
         listItemColl.AddRange(listItems);
         camlQuery.ListItemCollectionPosition = itemCollection.ListItemCollectionPosition;

         }
         catch (Exception ex)
         {
            throw new InvalidOperationException("Error on paging", ex);
         }
 }
 while (camlQuery.ListItemCollectionPosition != null);

如果可能,请向我们提供有关您的测试的反馈。


推荐阅读