SharePoint 2010. Consultar lista que excedan los límites

Para garantizar el rendimiento de SharePoint, las listas tienen definidos unos límites que no permiten hacer consultas de elementos por encima de estos. Por ejemplo, si tenemos puesto el límite a 5.000 elementos de lista, no vamos a poder ejecutar una consulta que devuelva un número superior de elementos, salvo que seamos administradores, que tienen otro límite definido y puede ser superior.

Esto no quiere decir que las listas de SharePoint no puedan almacenar más de estos límites, todo lo contrario, si las listas están bien definidas y tenemos una buena infraestructura, las listas soportan un gran número de elementos. El problema de rendimiento nos lo podemos encontrar realizando una consulta que devuelva muchos elementos y que, por ejemplo, se muestre en un sitio sin paginado. Con esta situación nos encontramos con dos problemas, el primero es el ViewState de la página ASP.NET con más de 5.000 filas en una lista, y el segundo en el servidor con esa cantidad de información en memoria.

En SharePoint 2010, tenemos una nueva clase, Microsoft.Office.Server.Utilities.ContentIterator, que nos permite realizar iteraciones sobre los elementos de las listas, sin que nos encontremos con la excepción de límite de consulta superado. Veamos un ejemplo.

protected void QueryWithContentIterator()

{

    //Creamos un CAML Query

    string query = @"<View>

        <Query>

            <Where>

                <And>

                    <BeginsWith>

                        <FieldRef Name='TITLE' />

                        <Value Type='Text'>TF</Value>

                    </BeginsWith>

                </And>

            </Where>

        </Query>

    </View>";

    

    //Instanciamos el iterator y procesamos los elementos del SPQuery

    var iterator = new ContentIterator();

    var listQuery = new SPQuery();

    listQuery.Query = query;

    SPList list = SPContext.Current.Web.Lists["Clientes"];

    //Cuando procesamos los elementos, tenemos que suscribirnos a los eventos de Error y de Procesado de Elemento

    iterator.ProcessListItems(list,

        listQuery,

        ProcessItem,

        ProcessError

    );

}

 

public    bool ProcessError(SPListItem item, Exception e) 

{ 

    //Capturamos el error

    return true; 

}

public void ProcessItem(SPListItem item)

{

    //Código para realizar acciones sobre el elemento actual.

}

Esta nueva clase nos da la posibilidad de hacer consultas procesando elemento a elemento de la misma, aún así, tengamos en cuenta que la interfaz de usuario debería de ser capaz de manejar esta cantidad de datos, por ejemplo, con paginación.

 

Saludos a todos…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *