График. Существует ли более простой / быстрый способ удаления всех элементов в списке SharePoint? - PullRequest
0 голосов
/ 24 сентября 2019

Следующий код запускается через список и удаляет каждый элемент.Есть ли более приятный способ удалить все элементы из списка?(За исключением удаления и воссоздания?) Что-то вроде List.Purge

var deleteQueryOptions = new List<QueryOption>()
{
   new QueryOption("expand", "fields(select=id)")
};

Console.WriteLine("Deleting ROWS from the list (UPDATING)");
var deleteItems = await graphServiceClient.Sites[siteUrl].Lists[listName].Items
                  .Request(deleteQueryOptions)
                  .GetAsync();

do
{
   Console.ForegroundColor = ConsoleColor.DarkYellow;
   Console.WriteLine("Processing PAGE of LIST ITEMS");
   Console.ResetColor();

   foreach (var deleteItem in deleteItems)
   {
      await graphServiceClient.Sites[siteUrl].Lists[listName].Items[deleteItem.Id]
                                .Request()
                                .DeleteAsync();
   }

   Console.ForegroundColor = ConsoleColor.Green;
   Console.WriteLine("Another PAGE of List Items successfully deleted");
   Console.ResetColor();
   try
   {
     deleteItems = await deleteItems.NextPageRequest.GetAsync();
   }
   catch
   {
     Console.ForegroundColor = ConsoleColor.DarkYellow;
     Console.WriteLine("There is no NextPageRequest for deleting items.");
     Console.ResetColor();
   }
   // While there is another page with data, get it and do the process again (At this moment 1 page contains 200 items, written by Marek Kyzivat @ 05/08/2019 )
} while (deleteItems.NextPageRequest != null);

Это выполнит работу, но если у вас есть большой список, это может занять некоторое время.

1 Ответ

1 голос
/ 25 сентября 2019

Если вы обновите свой внутренний цикл, как это, это должно помочь.

ServicePointManager.DefaultConnectionLimit = 30;
var tasks = new List<Task>();

foreach (var deleteItem in deleteItems)
{
    task.Add(graphServiceClient.Sites[siteUrl].Lists[listName].Items[deleteItem.Id]
                                .Request()
                                .DeleteAsync());
}

Task.WaitAll(tasks.ToArray());

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

Мне было бы очень интересно узнать влияние на производительность в этой конкретной ситуации.В настоящее время мы пытаемся определить лучшие модели программирования для одновременных запросов к Graph.

...