【问题标题】:Unable to fetch item in SharePoint List (threshold > 5000 ) through CSOM无法通过 CSOM 获取 SharePoint 列表中的项目(阈值 > 5000)
【发布时间】:2020-05-06 14:17:27
【问题描述】:

我正在尝试创建一个 Windows 窗体,用于将 SharePoint 列表中的信息填充到 Windows 窗体中。但是,当我尝试从列表中获取项目时,它会向我抛出一条错误消息

Microsoft.SharePoint.Client.dll 中出现“Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException”类型的未处理异常 附加信息:属性或字段尚未初始化。它尚未被请求或请求尚未执行。可能需要明确请求。”

这是相同的代码。

private void btn_populatecontainer_Click(object sender, EventArgs e)
        {
            var authManager = new AuthenticationManager();
            ClientContext overviewlistClientcontext = authManager.GetWebLoginClientContext("Tenant URL");
            var tenant = new Tenant(overviewlistClientcontext);
            var siteProperties = tenant.GetSiteByUrl("SiteCollectionURL");
            Web web = siteProperties.RootWeb;
            List olist = web.Lists.GetByTitle("SiteOverviewList");
            overviewlistClientcontext.Load(siteProperties);
            overviewlistClientcontext.ExecuteQuery();

            ListItemCollectionPosition position = null;
            var page = 1;
            do
            {
                CamlQuery camlQuery = new CamlQuery();
                camlQuery.ViewXml = @"<View Scope='Recursive'><RowLimit>4000</RowLimit><Query><Where><Eq><FieldRef Name='Site URL'/><Value Type='Text'>" + txtSite.Text + "</Value></Eq></Where></Query></View>";
                camlQuery.ListItemCollectionPosition = position;
                ListItemCollection listItems = olist.GetItems(camlQuery);
                overviewlistClientcontext.Load(listItems);
                overviewlistClientcontext.ExecuteQuery();
                position = listItems.ListItemCollectionPosition;
                DataTable dataTable = new DataTable();
                DataRow dr;
                DataColumn dc = new DataColumn("Site Owner");
                dc.DataType = Type.GetType("System.String");
                dataTable.Columns.Add(dc);
                foreach (var listItem in listItems)
                {
                    dr = dataTable.NewRow();
                    dr["Site Owner"] = listItem["Site Owner"];
                    dataTable.Rows.Add(dr);
                }
                OverViewListGrid.DataSource = dataTable;
                OverViewListGrid.DataBindings
                page++;*/
            }
            while (position != null);
}
    }
 }

我已调试代码,但在从 Caml Query 获取后尝试执行查询时失败。

  1. 当 CamlQuery 被执行时,它根本不起作用。
  2. 但是,出于测试目的,我尝试获取其他列,如果我尝试使用内置函数(即GetItembyID)直接获取 Title/Id 列,则代码可以正常工作。
  3. 但如果我使用同一列表中的另一列,即使是第二步也不起作用。

谁能帮我解决这个问题?

【问题讨论】:

    标签: sharepoint-online csom threshold sharepoint-list


    【解决方案1】:

    要从列表中过滤超过阈值的列表项,需要使用索引列。

    Site URL 需要被索引的列。

    <Query><Where><Eq><FieldRef Name='Site URL'/><Value Type='Text'>" + txtSite.Text + "</Value></Eq></Where></Query>
    

    否则,您需要通过分页从 SharePoint 中获取所有项目。

    CamlQuery camlQuery = new CamlQuery();
    camlQuery.ViewXml = @"<View Scope='Recursive'><RowLimit>4000</RowLimit><Query></Query></View>";
    

    然后,按 Linq 过滤。

    How I can filter a dataTable with Linq to datatable?

    【讨论】:

      【解决方案2】:

      异常表示您正在尝试获取尚未在上下文中初始化的列的值。为了得到它,您需要将它与列表项集合一起加载到客户端上下文中。获取所有字段的最简单方法是使用“FieldValuesAsText”。对于您的代码示例,更新后的代码如下所示

      ..... overviewlistClientcontext.Load(listItems, includes => includes.Include(i => i.FieldValuesAsText)); overviewlistClientcontext.ExecuteQuery(); position = listItems.ListItemCollectionPosition; DataTable dataTable = new DataTable(); DataRow dr; DataColumn dc = new DataColumn("Site Owner"); dc.DataType = Type.GetType("System.String"); dataTable.Columns.Add(dc); foreach (var listItem in listItems) { dr = dataTable.NewRow(); dr["Site Owner"] = listItem.FieldValuesAsText["Site Owner"]; dataTable.Rows.Add(dr); } .....

      另外请注意,您应该使用列的内部名称(而不是显示名称)来获取字段值。所以我怀疑你列“网站所有者”的内部名称是“Site_x0020_Owner”,所以你应该这样理解:

      dr["Site Owner"] = listItem.FieldValuesAsText["Site_x0020_Owner"];

      为了检查您的专栏的内部名称是什么,最简单的方法是进入您专栏的编辑页面,内部名称将作为 GET 参数之一作为 URL 的一部分

      【讨论】:

        猜你喜欢
        • 2011-08-30
        • 1970-01-01
        • 2020-11-07
        • 2015-10-15
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        相关资源
        最近更新 更多