CSOM 检索 ListItemCollection 为空

Posted

技术标签:

【中文标题】CSOM 检索 ListItemCollection 为空【英文标题】:CSOM Retrieving ListItemCollection is empty 【发布时间】:2021-02-09 03:02:21 【问题描述】:

我尝试制作一个简单的控制台应用程序,用于从 Share Point Online 中检索列表项。当我从网站检索网站列表或列表标题时,它工作正常,但是当我尝试从特定列表中获取它时,我没有收到任何列表项。 我列出了许多类似任务的示例,并且几乎所有示例都是以相同的方式编写的。所以我不排除我的情况可能是权限不足(我附上API权限截图)。

请检查我的代码和权限。任何帮助将不胜感激。

应用代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security;
using System.Threading.Tasks;
using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;

namespace SharePointTrigger

    class Program
    
        static async Task Main(string[] args)
        
            Uri site = new Uri("https://MyCompany.sharepoint.com/sites/MyProject");
            string user = $"ServiceUser@MyCompany.com";
            string rawPassword = $"password";
            SecureString password = new SecureString();
            foreach (char c in rawPassword) password.AppendChar(c);

            using (var authenticationManager = new AuthenticationManager()) //HELPER CLASS TO OBTAIN ACCESS TOKEN
            using (var context = authenticationManager.GetContext(site, user, password))
            

                //RETRIVING LIST TITLE - WORKS FINE
                /*
                Web web = context.Web;
                context.Load(web.Lists,
                lists => lists.Include(list => list.Title,
                                    list => list.Id));

                context.ExecuteQuery();

                foreach (SP.List list in web.Lists)
                
                    Console.WriteLine(list.Title);
                
                */

                //RETRIVING LIST ITEM
                Web myWeb = context.Web;
                SP.List myList = myWeb.Lists.GetByTitle("List_of_Items");

                SP.ListItemCollection listItemCollection = myList.GetItems(CamlQuery.CreateAllItemsQuery());

                context.Load(listItemCollection,
                            eachItem => eachItem.Include(
                                                        item => item,
                                                        item => item["Title"],
                                                        item => item["ID"]
                                                        )
                            );

                context.ExecuteQuery();

                foreach (SP.ListItem listItem in listItemCollection)
                
                    Console.WriteLine("ID: " + listItem["ID"].ToString() + "Title: " + (string)listItem["Title"].ToString());

                
                Console.ReadKey();
            
        
    

API 权限 API permissions

【问题讨论】:

【参考方案1】:

检查您的应用权限或代码问题时看起来不像是权限问题。

但是,看看下面的行:

SP.ListItemCollection listItemCollection = myList.GetItems(CamlQuery.CreateAllItemsQuery());

您正试图带入所有物品。

当列表是一个非常大的列表(>5000 或超过 12 个查找列)或the list hits a list threshold)时,观察到返回空项的类似行为

如果您遇到上述情况 - 您可以创建索引并过滤项目。

您可以使用 CAML 查询来过滤项目,而不是尝试一次获取所有项目!

CAML 查询参考: https://techcommunity.microsoft.com/t5/sharepoint/filtering-list-item-using-caml-query-in-sharepoint/m-p/1415904

https://sharepoint.stackexchange.com/questions/94631/filtering-list-using-caml-query-and-binding-it-to-dropdown-in-c

另外,我会检查项目是否具有项目级别权限。

列表设置 -> 高级设置

理想情况下,您不应该因为上述原因而遇到此问题,但是此设置会增加范围的数量并可能导致更快地达到阈值,因为。

【讨论】:

@Mikhail - 想检查以上内容是否有帮助或您有任何疑问? 非常感谢您的回答。至于项目数量限制,该列表仅包含十项。但是,我已经记下了您对进一步代码优化的建议。至于第二个假设,我已经多次滚动“高级部分”,看起来“项目级别权限”选项已从此部分中删除/替换,或者由于没有权限而对我不可用。您是否遇到过缺少“项目级权限”选项? 什么是列表模板? (自定义列表、任务列表?) 另外,你有多个查找列吗? 列表模板是“GenericList”("CustomList", ListTemplateId=100) 并且没有计算列。

以上是关于CSOM 检索 ListItemCollection 为空的主要内容,如果未能解决你的问题,请参考以下文章

从 Sharepoint 列表中获取所有项目,包括使用 CSOM 的查找值

如何在 CSOM 请求中包含项目的 FieldValues

如何使用 CSOM 从/向 SharePoint 2013 下载/上传文件?

将自定义 Web 部件添加到页面 SharePoint 2013 c# csom

Sharepoint Online 使用 C# / CSOM 更改 WebPart 视图查询

不使用 SharePointOnlineCredentials 的 Project Online CSOM