CSOM ListCollectionItems 计数基于文件夹路径性能问题

问题描述

我有一个设计要求,可以根据文件夹路径指定的文件获取 ListItemCollection 的总数。我目前有以下代码

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

        camlQuery.FolderServerRelativeUrl = getSiteUrlAbsolutePath(siteUrl) +
            "/Shared Documents/" + folderPath;

        camlQuery.ViewXml = "<View Scope="RecursiveAll">" +
                                "<Query>" +
                                    "<Where>" +
                                        "<Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value></Eq>" +
                                    "</Where>" +
                                "</Query>" +
                            "</View>";

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

        ListItemCollection listItems = list.GetItems(camlQuery);

        spClientContext.Load(listItems);

        spClientContext.ExecuteQuery();

        if (listItems != null && listItems.Count > 0)
        {
            foreach (ListItem item in listItems)
            {
                if (item.FileSystemObjectType.Equals(FileSystemObjectType.File))
                {
                    totalCount++;
                }
            }
        }
    }
}

这对我来说似乎是一个非常简单的查询。我没有加载一堆参数等。但是,当前需要以下时间来执行:

Total Count = 403
Execution Time =  ~ 1276 ms

对于一个简单的查询来说,这似乎特别长?有什么明显的方法可以优化代码吗?

编辑[回复@Darshani Jayasekara]:

更新以显示隔离时间记录:

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

        camlQuery.FolderServerRelativeUrl = getSiteUrlAbsolutePath(siteUrl) +
            "/Shared Documents/" + folderPath;

        camlQuery.ViewXml = "<View Scope="RecursiveAll">" +
                                "<Query>" +
                                    "<Where>" +
                                        "<Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value></Eq>" +
                                    "</Where>" +
                                "</Query>" +
                            "</View>";
                            
        // ************ Start Execution Time Logging ***************************************************************                            
        Stopwatch stopwatch = Stopwatch.StartNew();             

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

        ListItemCollection listItems = list.GetItems(camlQuery);

        spClientContext.Load(listItems);

        spClientContext.ExecuteQuery();
    
        // ************ Stop Execution Time Logging ***************************************************************     
        stopwatch.Stop();
        
        Debug.WriteLine("Execution time: " + stopwatch.ElapsedMilliseconds + " ms.");       

        if (listItems != null && listItems.Count > 0)
        {
            foreach (ListItem item in listItems)
            {
                if (item.FileSystemObjectType.Equals(FileSystemObjectType.File))
                {
                    totalCount++;
                }
            }
        }
    }
}

5 次运行的执行时间:

Execution time: 1348 ms. Total Count = 403
Execution time: 1125 ms. Total Count = 403
Execution time: 1447 ms. Total Count = 403
Execution time: 1102 ms. Total Count = 403
Execution time: 1402 ms. Total Count = 403

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)