使用客户端上下文和 CAML 查询删除 SharePoint 列表中的所有行

11

我是SharePoint的新手,想要使用C# ClientContext类和CAML查询来删除SharePoint列表中的所有行。

如何高效地实现它呢?

2个回答

17

我解决了它。所得的教训是我们需要倒序删除列表中的项。

链接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");
    }
}

8
从效率角度来看,把ExecuteQuery()语句移到循环外可能会更加高效。 - Lee Richardson
4
如果将ExecuteQuery移动到循环外,并且您将多个删除作为“一次执行”发送,可能会遇到例外情况,其中Sharepoint认为您的请求太大(我曾经用几千个删除遇到过这种情况)。请参见http://sharepoint.stackexchange.com/questions/44894/client-object-model-microsoft-sharepoint-client-serverexception-the-request - n00b
6
我同意@n00b的看法,但为了减少网络开销,我会添加 if (counter % 100 == 0){ clientContext.ExecuteQuery(); } - Emaborsa

0
另一个解决方法: - 在一个新的列表(称为“配置”)上创建一个项(称为“deleteAllItems”)。
  • 使用 CAML 将 deleteAllItems 的值从 False 更改为 True。

  • 然后,使用工作流程

    如果 deleteAllItems == True,则删除所有项目。

    将 deleteAllItems 重置为 False。

解决客户端性能问题。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接