How do I speed up below Sharepoint CSOM code?

1k views Asked by At

I have below CSOM code to delete all list items from the list. But it is very slow. How can I make it faster.

 public void DeleteListData()
        {
            string root = "mysite.com/";
            using (ClientContext clientContext = new ClientContext(root))
            {
                Web web = clientContext.Web;
                List list = web.Lists.GetByTitle("Search");
                var query = new CamlQuery() { ViewXml = "<View><Query><Where><IsNotNull><FieldRef Name='First_x0020_Name' /></IsNotNull></Where></Query></View>" };
                var items = list.GetItems(query);
                clientContext.Load(items);
                clientContext.ExecuteQuery();
                var count = items.Count;
                if (count > 0)
                {
                    for (int i = 0; i < count; i++)
                    {
                        items[i].DeleteObject();
                        items[i].Update();
                    }
                }

                clientContext.ExecuteQuery();
            }
        }
1

There are 1 answers

0
Lee On

Almost fine according to my knowledge, just trying to add batch logic to limit deleting items count each query.

I think below code is good sample.

andyhuey/deleteAllFromList.cs

private void deleteAllFromList(ClientContext cc, List myList)
{
    int queryLimit = 4000;
    int batchLimit = 100;
    bool moreItems = true;

    string viewXml = string.Format(@"
        <View>
            <Query><Where></Where></Query>
            <ViewFields>
                <FieldRef Name='ID' />
            </ViewFields>
            <RowLimit>{0}</RowLimit>
        </View>", queryLimit);
    var camlQuery = new CamlQuery();
    camlQuery.ViewXml = viewXml;

    while (moreItems)
    {
        ListItemCollection listItems = myList.GetItems(camlQuery); // CamlQuery.CreateAllItemsQuery());
        cc.Load(listItems,
            eachItem => eachItem.Include(
                item => item,
                item => item["ID"]));
        cc.ExecuteQuery();

        var totalListItems = listItems.Count;
        if (totalListItems > 0)
        {
            Console.WriteLine("Deleting {0} items from {1}...", totalListItems, myList.Title);
            for (var i = totalListItems - 1; i > -1; i--)
            {
                listItems[i].DeleteObject();
                if (i % batchLimit == 0)
                    cc.ExecuteQuery();
            }
            cc.ExecuteQuery();
        }
        else
        {
            moreItems = false;
        }
    }
    Console.WriteLine("Deletion complete.");
}