Pergunta

Quero obter o número total de itens que correspondem à minha consulta, mas também limitar os resultados.

  • Digamos que tenho 100 itens na lista.
  • 50 dos 100 itens da lista correspondem à minha consulta.
  • Quero apenas 10 dos 50.
  • Como posso obter o "50"?

Uma consulta simples:

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;
Foi útil?

Solução

Este é um problema bastante conhecido e muito difícil de resolver, principalmente quando se trata de grandes volumes de dados.Mesmo sem tocar no SharePoint, você deve ter notado que muitos sistemas (o Google é um exemplo óbvio) retornam apenas um número aproximado de elementos filtrados.

Basicamente, a única coisa que você pode fazer é realizar a mesma consulta, mas excluir as permissões e todos os campos, exceto o ID, dos resultados.Então em termos de SQL será algo assim:

SELECT id FROM list WHERE (filter)

Se você tiver mais de 5.000 itens na lista (ou outro valor que exceda o valor da configuração "Limite de aceleração" que você pode encontrar nas configurações do aplicativo da web), você terá que coloque todos os campos que participam do filtro para indexar (consulte o link "Colunas indexadas" na página "Configurações da lista"), e voce terá que abandonar a filtragem por campos semelhantes aos de pesquisa (estes são campos dos seguintes tipos:Pesquisa, Metadados Gerenciados, Pessoas e Grupos, Status do Fluxo de Trabalho).

Também é aconselhável limitar até mesmo esta consulta por um número grande, digamos, 100 mil itens ou algo assim, então será:

SELECT TOP 100000 id FROM list WHERE (filter)

Então, como ficará aplicado ao 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, lembre-se de que o desempenho será lento se você tiver uma grande quantidade de itens ou se tiver um filtro pesado (em termos de SQL).

Outras dicas

As consultas em tempo real afetam bastante o desempenho; realmente não há uma boa maneira de contar os itens em uma lista sem iterá-los.

Lembre-se também de que ItemCount e list.Items.Count retornarão números diferentes em alguns casos.

Para listas grandes, há um raciocínio por trás desta decisão:http://technet.microsoft.com/en-us/library/cc262813.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top