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;
    
    .

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top