CSOM, извлекающий ListItemCollection, пуст

#c# #sharepoint-online #csom #azure-api-apps #sharepoint-list

#c# #sharepoint-online #csom #azure-api-приложения #sharepoint-список

Вопрос:

Я попытался создать простое консольное приложение, которое извлекает элементы списка из общей точки доступа в Интернете. Он отлично работает, когда я извлекаю список сайтов или заголовки списков с сайта, но я не получаю элементов списка, когда пытаюсь получить его из определенного списка. Я перечислил много примеров похожих задач, и почти все они были написаны одинаково. Вот почему я не исключаю, что причина моего случая может быть в недостаточных разрешениях (я прилагаю скриншот разрешений 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

Ответ №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

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

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

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

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

Комментарии:

1. @Mikhail — хотел проверить, помогло ли вышеупомянутое, или у вас есть какие-либо вопросы?

2. Большое вам спасибо за ваш ответ. Что касается ограничений на количество элементов, список содержит только десять элементов. Однако я принял к сведению ваши советы по дальнейшей оптимизации кода. Что касается второго предположения, я несколько раз прокручивал «Расширенный раздел», и похоже, что опция «Разрешение на уровне элемента» была удалена / заменена из этого раздела или недоступна для меня из-за отсутствия разрешения. Сталкивались ли вы с отсутствием опции «Разрешение на уровне элемента»?

3. Что такое шаблон списка? (Пользовательский список, список задач ?)

4. Кроме того, у вас есть несколько столбцов поиска?

5. Шаблон списка — «GenericList» («CustomList», ListTemplateId= 100), и в нем нет вычисляемых столбцов.