【发布时间】:2011-11-20 10:52:06
【问题描述】:
我想使用 Lists Web 服务从 SharePoint 列表中删除所有项目, 我知道我们可以通过迭代所有项目来做到这一点,我的问题是,我的列表中有 25000 个项目,想一次性删除它,有没有办法做到这一点?
或者有没有办法获取列表的所有属性,然后删除列表并使用以前保存的属性重新创建列表。
提前致谢。
【问题讨论】:
标签: sharepoint c#-4.0 sharepoint-2010
我想使用 Lists Web 服务从 SharePoint 列表中删除所有项目, 我知道我们可以通过迭代所有项目来做到这一点,我的问题是,我的列表中有 25000 个项目,想一次性删除它,有没有办法做到这一点?
或者有没有办法获取列表的所有属性,然后删除列表并使用以前保存的属性重新创建列表。
提前致谢。
【问题讨论】:
标签: sharepoint c#-4.0 sharepoint-2010
您可以将列表另存为模板(列表设置 -> 将列表另存为模板),然后删除该列表,然后根据您保存的模板创建一个新列表。
【讨论】:
您可以使用 Lists Web 服务的 UpdateListItems 方法,但是一次删除所有项目仍然需要很长时间。 试试下面的 sn-p -
var batch = new StringBuilder();
batch.Append("<Batch OnError='Continue' ListVersion='1' ListName='{GUID}'>");
string itemTemplate = "<Method ID='1' Cmd='Delete'><Field Name='ID'>{0}</Field></Method>";
for (int i = 0; i < 300000; i++)
batch.Append(string.Format(itemTemplate, i));
batch.Append("</Batch>");
//query Lists service
此代码假定您的项目 ID 范围是 0 到 300000 - 这将是您唯一的选择,无需迭代 所有项目(并获取他们的 ID)。然而,有了这么多的项目,即使是 StringBuilder 也会遇到性能问题 问题,更不用说 SharePoint。
您最好的选择是删除该站点并按照 pmartin 的建议重新创建它。
【讨论】:
这是我们可以简单地做到这一点的方法:
XmlNode listItems = SharepointUtilities.GetListItems(sharePointCredentials, sharePointCredentials.SharePointListName);
var nodes = (from nd in listItems.ChildNodes.OfType<XmlNode>() where nd.NodeType.Equals(System.Xml.XmlNodeType.Element) select nd);
var itemIDs = from nd in nodes.FirstOrDefault().ChildNodes.OfType<XmlNode>() where nd.NodeType.Equals(System.Xml.XmlNodeType.Element) select nd.Attributes["ows_ID"].Value;
if (itemIDs.Count() > 0)
{
Lists spSrv = GetSharepointListsService(sharePointCredentials);
XmlDocument doc = new XmlDocument();
XmlElement batchElement = doc.CreateElement("Batch");
batchElement.SetAttribute("OnError", "Continue");
string batchCommand = "<Method ID='1' Cmd='Delete'><Field Name='ID'>";
batchCommand += string.Join("</Field></Method><Method ID='1' Cmd='Delete'><Field Name='ID'>", itemIDs.ToArray());
batchCommand += "</Field></Method>";
batchElement.InnerXml = batchCommand;
spSrv.UpdateListItems(sharePointCredentials.SharePointListName, batchElement);
}
【讨论】:
在 DataSheetView 中打开列表,选择所有记录 (ctrl+A) 并删除所有记录。 这是最短的解决方案。
【讨论】: