Получение 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 = $"[email protected]";
            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


person Mikhail Lazutkin    schedule 26.10.2020    source источник


Ответы (1)


Это не похоже на проблему с разрешением при проверке разрешений вашего приложения или проблему с кодом.

Однако, глядя на строку ниже:

SP.ListItemCollection listItemCollection = myList.GetItems(CamlQuery.CreateAllItemsQuery());

Вы пытаетесь собрать все предметы.

Аналогичное поведение наблюдается при возврате пустых элементов, когда список очень большой (>5000 или более 12 столбцов поиска) или список достигает порога списка)

Если вы попадаете в описанный выше сценарий, вы можете создать индекс и отфильтровать элементы.

Вы можете использовать запрос 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

Кроме того, я бы проверил, имеют ли элементы разрешение на уровне элемента.

Настройки списка > Дополнительные настройки

введите здесь описание изображения

В идеале вы не должны сталкиваться с этой проблемой из-за вышеизложенного, однако эти настройки увеличивают количество областей и могут привести к более раннему достижению порога, потому что.

person Satya V    schedule 27.10.2020
comment
@Mikhail - хотел проверить, помогло ли вышеизложенное, или у вас есть какие-либо вопросы? - person Satya V; 27.10.2020
comment
Большое спасибо за ваш ответ. Что касается ограничений по количеству позиций, то список содержит только десять позиций. Однако я принял к сведению ваш совет по дальнейшей оптимизации кода. Что касается второго предположения, я несколько раз прокручивал расширенный раздел, и похоже, что параметр разрешения на уровне элемента был удален / заменен из этого раздела или недоступен для меня из-за отсутствия разрешения. Сталкивались ли вы с отсутствием разрешения на уровне элемента? - person Mikhail Lazutkin; 27.10.2020
comment
Что такое шаблон списка? (Пользовательский список, список задач?) - person Satya V; 27.10.2020
comment
Кроме того, у вас есть несколько столбцов поиска? - person Satya V; 27.10.2020
comment
Шаблон списка — GenericList(CustomList, ListTemplateId=100), и в нем нет вычисляемых столбцов. - person Mikhail Lazutkin; 27.10.2020
comment
Сатья В., что касается отсутствия параметра безопасности на уровне элементов, я нашел тему с аналогичной проблемой с SharePoint 2013 sharepoint.stackexchange.com/questions/191493/, но этот трюк не работает для SharePoint онлайн. Если я исправляю, это означает, что я должен проверить значение атрибута ReadSecurity docs.microsoft.com/ru-ru/sharepoint/dev/schema/ . Знаете ли вы метод, как это проверить? - person Mikhail Lazutkin; 28.10.2020
comment
Я также могу просмотреть его в автономном режиме для более подробного изучения и предоставить быструю специализированную помощь. Пожалуйста, отправьте электронное письмо с темой «Attn:Sathya» в AzCommunity[at]Microsoft[dot]com со ссылкой на эту тему. - person Satya V; 28.10.2020
comment
Текущее значение ReadSecurity для всех списков равно 1, это означает, что все пользователи имеют доступ на чтение ко всем элементам. Хорошо, спасибо, я свяжусь с вами, если не найду решения. - person Mikhail Lazutkin; 28.10.2020