Obtenha SPQuery TotalItems da consulta
-
10-12-2019 - |
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;
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