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 从/向 SharePoint 2013 下载/上传文件?
将自定义 Web 部件添加到页面 SharePoint 2013 c# csom