Невозможно получить элемент в списке SharePoint (порог> 5000) через CSOM - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь создать Windows форму для заполнения информации из списка SharePoint в Windows форму. Однако, когда я пытаюсь извлечь элемент из списка, он выдает мне сообщение об ошибке

Необработанное исключение типа «Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException» произошло в Microsoft.SharePoint.Client .dll Дополнительная информация: свойство или поле не были инициализированы. Он не был запрошен или запрос не был выполнен. Может потребоваться явный запрос. "

Вот код для того же самого.

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).
  3. Но даже вторые шаги не будут работать, если я использую другой столбец из того же списка.

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 21 января 2020

исключение говорит о том, что вы пытаетесь получить значение столбца, который не был инициализирован в контексте. Чтобы получить его, вам необходимо загрузить его в контекст клиента вместе с коллекцией элементов списка. Самый простой способ получить все поля - использовать 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"];


Чтобы проверить, каково внутреннее имя вашего столбца, самое простое Вы можете ввести страницу редактирования Вашего столбца, и внутреннее имя будет частью URL как один из параметров GET enter image description here

0 голосов
/ 21 января 2020

Чтобы отфильтровать элементы списка из списка, превышающего порог, необходимо использовать индексированный столбец.

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.

Как отфильтровать таблицу данных с помощью Linq в таблицу данных?

...