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

Posted

技术标签:

【中文标题】从 Sharepoint 列表中获取所有项目,包括使用 CSOM 的查找值【英文标题】:Get all items from Sharepoint list including lookup values using CSOM 【发布时间】:2020-11-07 12:41:51 【问题描述】:

我想从 Sharepoint 列表中检索所有项目,包括查找字段的 ID 和值。 查找列表与查询列表位于相同的站点/url。目前我收到“属性或字段尚未初始化”错误。

如何正确地将查找字段加载到客户端上下文中,以便可以访问该属性?

在搜索和尝试不同的事情但没有成功之后,例如使用 list.GetRelatedFields() 获取所有相关字段并通过迭代相关字段集合中的列表 ID 来加载所有列表中的所有字段,我需要帮助。

我再也看不到森林了。任何提示表示赞赏。提前致谢。

更新

发生了两件事。首先,我也忘记将列表对象加载到上下文中。其次,我尝试请求配置错误的属性/列。

Sharepoint Online 上的列表是从另一个 Sharepoint 站点复制的,其中包括自动复制用于查找的列表。

似乎此重复已损坏查找列。我必须手动删除查找列并将其读取到请求的列表中。

现在,它起作用了! :)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using SP = Microsoft.SharePoint.Client;

    namespace Theroka 

        class Sharepoint 

            private private SP.ClientContext context;

            // credential handling, authorization, context creation, etc. ....
            
            public void getItems() 
                SP.List list = this.context.Web.Lists.GetByTitle("NameOfList");
                this.context.Load(list); // UPDATE: I've forgot to load the list too
                this.context.Load(list.Fields, c => c.Where(e => e.Hidden != true));
                this.context.ExecuteQuery();

                ListItemCollectionPosition position = null;
                do 
                    CamlQuery query = CamlQuery.CreateAllItemsQuery(5000);
                    query.ListItemCollectionPosition = position;
                    SP.ListItemCollection items = list.GetItems(query);
                    this.context.Load(items);
                    this.context.ExecuteQuery();
                    position = items.ListItemCollectionPosition;
                    foreach(SP.ListItem item in items) 
                        // this works now
                        SP.FieldLookupValue lv = (item["LookupFieldName"] as SP.FieldLookupValue);
                        Console.WriteLine("0\t1\t2", item.Id, item["Title"], lv.LookupValue.ToString());
                    
                 while (position != null);
            

        
    

亲切的问候,

罗卡

【问题讨论】:

【参考方案1】:

您可以尝试将列表项的所有字段作为文本加载到上下文中并仅显示它们,我认为这是最简单的方法,但可能不是最有效的方法。在这种情况下,查找列也应该作为文本值(而不是 id)可见。

将字段值包含为文本 您需要将其与加载项一起加载到上下文中。因此,对于您的示例,它将类似于

this.context.Load(items, items => items.Include(item => item.FieldValuesAsText));

之后您应该能够获得查找列的值,例如:

item.FieldValuesAsText["LookupFieldName"]

希望对你有帮助

【讨论】:

嗨,亚当,感谢您的回答。对不起我迟到的反应。我不能早点回来。尝试了这个并得到了另一个错误。这导致了我的错误——我忘记将列表对象加载到上下文中——以及 Sharepoint 列表本身中的错误列。除了对共享点列表进行必要的更改(请参阅更新的帖子)之外,代码现在可以工作了。谢谢。

以上是关于从 Sharepoint 列表中获取所有项目,包括使用 CSOM 的查找值的主要内容,如果未能解决你的问题,请参考以下文章

powershell 获取SharePoint库中所有文件夹的列表,包括子文件夹

从 sharepoint 获取所有文档的列表

csharp 使用客户端对象模型从SharePoint列表中删除所有项目

根据搜索查询从多个提到的列表中获取项目计数

如何简单快速获取SharePoint列表的GUID

powershell 此SharePoint PowerShell从Web应用程序中的所有站点获取使用特定内容类型的列表的URL。