Get Spquery TotalItems dalla query
-
10-12-2019 - |
Domanda
Voglio ottenere il numero totale di elementi che corrispondono alla mia query, ma limitano anche i risultati.
- .
- Quindi dicono che ho 100 elementi nella lista.
- 50 dei 100 elementi nella lista corrispondono alla mia query.
- Voglio ottenere solo 10 dei 50.
- Come posso ottenere il "50"?
Una semplice interrogazione:
.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;
Soluzione
Questo è un problema ben noto e molto difficile da risolvere, specialmente quando si tratta di grandi volumi di dati. Persino non toccando SharePoint, potresti aver notato che molti sistemi (Google è un esempio ovvio) restituisce solo il numero approssimativo di elementi filtrati.
Fondamentalmente l'unica cosa che puoi fare è eseguire la stessa query ma escludere le autorizzazioni e tutti i campi tranne ID dai risultati. Quindi in termini di SQL sarà qualcosa del genere:
SELECT id FROM list WHERE (filter)
.
Se si dispone di più di 5 000 elementi nell'elenco (o altro valore che supera il valore di impostazione del "limite di throttling" che è possibile trovare nelle impostazioni dell'applicazione Web), dovrai Metti tutti i campi che partecipano a Il filtro per indicizzare (vedere il collegamento "colonne indicizzate" sulla pagina "Impostazioni elenco"), e dovrai Abbandoni il filtraggio per campi simili a Like (Questi sono campi dei seguenti tipi: ricerca, metadati gestiti, persone e gruppo, stato del flusso di lavoro).
Inoltre è consigliabile limitare anche questa query con un grande numero, diciamo, 100 mila articoli o qualcosa del genere, quindi sarà:
.
SELECT TOP 100000 id FROM list WHERE (filter)
Allora, come sembrerà applicato 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
};
Per favore, tieni presente che eseguirà lento se hai una grande quantità di articoli o se hai un filtro pesante (in termini di SQL).
Altri suggerimenti
Le query in tempo reale hanno successo le prestazioni abbastanza dure, non è davvero un buon modo per contare gli articoli in un elenco senza interagging.
Tieni anche a mente ItemCount ed List.Items.Count restituirà numeri diversi in alcuni casi.
Per le liste di grandi dimensioni c'è un ragionamento dietro questa decisione: http://technet.microsoft.com/en-us/library/cc262813.aspx