Se vi è mai capitato da dover cancellare tutti gli elementi di una lista, o cmq una grossa quantità di questi elementi, è probabile che abbiate percorso la via di ciclare tutti questi elementi e richiamare il metodo Delete() su oguno di questi. Se è così, vi sarete sicuramente accorti che l'operazione di cancellazione, a fronte della presenza di tanti elementi all'interno della lista, sarà risultata veramente lenta.
Questo perchè ad ogni chiamata del metodo Delete() della classe SPListItem viene fatta una query sul database di contenuto di SharePoint.
Dovete sapere però, che esiste un modo per fare eseguire un'unica query al database e cancellare allo stesso modo tanti elementi di una lista. Questo grazie al metodo ProcessBatchData della classe SPWeb.
Questo metodo vuole come parametro di input una stringa in formato XML che specifichi il numero e la tiplogia di operazioni da eseguire assieme.
Vediamo quindi come possiamo cancellare più elementi da una lista, in un colpo solo:
StringBuilder sb = new StringBuilder();
sb.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Batch>");
foreach (SPListItem CurrentItem in CurrentList.Items)
{
sb.Append("<Method>");
sb.Append("<SetList Scope=\"Request\">" + CurrentList.ID + "</SetList>");
sb.AppendFormat("<SetVar Name=\"ID\">{0}</SetVar>", CurrentItem.ID);
sb.Append("<SetVar Name=\"Cmd\">Delete</SetVar>");
sb.Append("</Method>");
}
sb.Append("</Batch>");
SPContext.Current.Site.RootWeb.ProcessBatchData(sb.ToString());
Come vi sarete accorti, la sintassi XML da utilizzare per la specifica di queste operazioni (che nel nostro caso sono solamente delle cancellazion) è molto simile a quelli che dobbiamo utilizzare per richiamare i web services esposti da SharePoint (già dalla versione 2007 del prodotto).
In questo esempio abbiamo visto come è possibile fare tante operaioni di cancellazione in un colpo solo, ma volendo, possiamo eseguire operazioni di vario genere e vi assiucuro che la cosa pu essere veramente utile.