Odpowiedz

10

Rozwiązałem to. Nauka polegała na tym, że musimy usunąć pozycje z listy w odwrotnej kolejności.

link: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitemcollection.delete.aspx

ListItemCollection listItems = oList.GetItems(CamlQuery.CreateAllItemsQuery()); 
clientContext.Load(listItems, 
        eachItem => eachItem.Include(
        item => item, 
        item => item["ID"])); 
clientContext.ExecuteQuery(); 

var totalListItems = listItems.Count; 
Console.WriteLine("Deletion in " + currentListName + "list:"); 
if (totalListItems > 0) 
{ 
    for (var counter = totalListItems - 1; counter > -1; counter--) 
    { 
     listItems[counter].DeleteObject(); 
     clientContext.ExecuteQuery(); 
     Console.WriteLine("Row: " + counter + " Item Deleted"); 
    } 
} 
+6

Jeśli chodzi o efektywność, zapewne dobrze byłoby przenieść instrukcję ExecuteQuery() poza pętlę. –

+1

Jeśli przenosisz ExecuteQuery na zewnątrz pętli i masz wiele usunięć wysłanych jako "jedno wykonanie", możesz potencjalnie wystartować w wyjątku, w którym SharePoint uważa, że ​​twoje żądanie jest zbyt duże (zdarzyło mi się to z kilkoma tysiącami usunięć) . Zobacz http://sharepoint.stackexchange.com/questions/44894/client-object-model-microsoft-sharepoint-client-serverexception-the-request – n00b

+3

i Zgadzam się z @ n00b, ale aby zmniejszyć obciążenie sieci, dodałbym. if (counter% 100 == 0) {clientContext.ExecuteQuery(); } ' – Emaborsa

0

Innym obejście: - Tworzenie przedmiotów (powiedział: deleteAllItems), na nowej liście (powiedział: konfiguracja).

  • Użyj CAML, aby zmienić wartość deleteAllItems z False na True.

  • następnie wykorzystanie workflow,

    jeśli deleteAllItems == true, należy usunąć wszystkie przedmioty.

    resetuj elementy delete do fałszywych.

Rozwiązać problem z wydajnością po stronie klienta. :)

Powiązane problemy