Pregunta

Quiero obtener el número total de artículos que coincidan con mi consulta, pero también limitan los resultados.

  • así que diga 100 artículos en la lista.
  • 50 de los 100 artículos en la lista coinciden con mi consulta.
  • quiero obtener solo 10 de los 50.
  • ¿Cómo puedo obtener el "50"?

    Una consulta simple:

    SPQuery query = new SPQuery() { Query = "<OrderBy><FieldRef Name='FullName' /></OrderBy><Where><Contains><FieldRef Name='FirstName' /><Value Type='Text'>e</Value></Contains></Where>" };
    SPList oList = web.Lists["Profile"];
    SPListItemCollection items = oList.GetItems(query);
    int count = items.Count;
    

¿Fue útil?

Solución

Este es un problema bien conocido y muy difícil de resolver, especialmente cuando se trata de grandes volúmenes de datos. Incluso no tocando SharePoint, es posible que haya notado que muchos sistemas (Google es un ejemplo obvio) devuelve solo el número aproximado de elementos filtrados.

Básicamente, lo único que puede hacer es realizar la misma consulta pero excluir permisos y todos los campos, excepto ID de los resultados. Así que en términos de SQL será algo así:

SELECT id FROM list WHERE (filter)

Si tiene más de 5 000 artículos en la lista (u otro valor que exceda el valor de configuración del "límite de aceleración" que puede encontrar en la configuración de la aplicación web), tendrá que poner todos los campos en los que participan en El filtro a índice (consulte "Columnas indexadas" enlace en la página "Configuración de la lista"), y tendrá que abandonando el filtrado por los campos tipo búsqueda (Estos son campos de los siguientes tipos: búsqueda, metadatos administrados, personas y grupo, estado de flujo de trabajo).

También es recomendable limitar incluso esta consulta por algún gran número, digamos, 100 mil artículos o algo así, por lo que será:

SELECT TOP 100000 id FROM list WHERE (filter)

Entonces, ¿cómo se verá aplicado a Spquery?

var query = new SPQuery()
{
    // please make sure FirstName and FullName fields are added to index!!
    Query = "<OrderBy><FieldRef Name='FullName' /></OrderBy><Where><Contains><FieldRef Name='FirstName' /><Value Type='Text'>e</Value></Contains></Where>",
    ViewFields = "ID",
    ViewFieldsOnly = true,
    IncludePermissions = false,
    RowLimit = 100000
};

Por favor, tenga en cuenta que se realizará lento si tiene una gran cantidad de elementos o si tiene un filtro pesado (en términos de SQL).

Otros consejos

Las consultas en tiempo real afectaron a un rendimiento bastante duro, realmente no hay una buena manera de contar los artículos en una lista sin la iteración a través de ellos.

También tenga en cuenta el recuento y la lista.items.count devolverá diferentes números en algunos casos.

Para listas grandes, hay razonamiento detrás de esta decisión: http://technet.microsoft.com/en-us/library/cc262813.aspx

Licenciado bajo: CC-BY-SA con atribución
scroll top