Social Icons

miércoles, 8 de octubre de 2008

Intentando borrar elementos de lista rápidamente

Actualmente estoy importando grandes cantidades de datos a listas de SharePoint, y (como muchas veces meto la pata) se me ha planteado la necesidad de borrarlos.

Empecé haciendo esto:

public static void limpiaLista(SPList lista)
{
while
(lista.Items.Count > 0)
lista.Items[0].Delete();
}
Y efectivamente, de esta forma terminas por borrar los elementos, pero cuando hay más de 2000 empiezas a notar que tarda. Entonces me puse a investigar y leí que era por culpa del modelo de objetos. Solución: Nos saltamos el modelo de objetos con comandos CAML.

Tras otro rato de investigación cambié mi procedimiento por:
public static void limpiaListaRapido(SPList lista)

{

List<int> items = new List<int
>();

foreach (SPListItem item in
lista.Items)

items.Add(item.ID);

// Creamos el batch CAML

string batch = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+

"<Batch>"
+

"<Method>"
+

"<SetList Scope=\"Request\">" + lista.ID + "</SetList>"
+

"<SetVar Name=\"ID\">{0}</SetVar>"
+

"<SetVar Name=\"Cmd\">Delete</SetVar>"
+

"</Method>"
+

"</Batch>"
;



// Y ahora para cada objeto de la lista aplicamos el comando

foreach (object item in
items)

lista.ParentWeb.ProcessBatchData(
string
.Format(batch, item));

}


Y probé, y era más rápido, de hecho bastante más rápido, pero tenía un problema, que no solo borraba los elementos de la lista sino que, además, los metía en la papelera de reciclaje, con lo cual tras hacer el "limpiaListaRapido", si no quieres esperar 60 días a que te desaparezcan los datos basura tienes que hacer esto:


public static void vaciaPapeleras(SPWeb web)
{
//Vaciamos la papelera del sitio
web.RecycleBin.DeleteAll();
//Vaciamos la papelera de la coleccide sitios
web.Site.RecycleBin.DeleteAll();
}


Y resulta que vaciar las dos papeleras de reciclaje tarda otro buen rato por lo que en resumen:

El tiempo que tarda "limpiaLista" es comparable al tiempo que tarda "limpiaListaRapido"+"vaciaPapeleras".

Eso sí, si no te importa que la papelera se te llene de basura (que bien mirado para eso esta), el método de las CAML es bastante más rápido.

Ahora, la pregunta que me surge es otra, ¿Hay un comando CAML que borre las entradas sin pasar por la papelera? Si lo encuentro lo postearé (suponiendo que lo busque).

No hay comentarios: