CSOM检索ListItemCollection为空

问题描述

我试图制作一个简单的控制台应用程序,该应用程序从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

解决方法

在检查您的应用权限或代码问题时,看起来好像没有权限问题。

但是,请看下面的行:

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

我还要检查这些物品是否具有物品级别权限。

列表设置->高级设置

enter image description here

理想情况下,由于上述原因,您不应遇到此问题,但是此设置会增加作用域的数量,并且可能会导致更快达到阈值。