Question

Je veux obtenir le nombre total d'éléments qui correspondent à ma requête, mais limitent également les résultats.

  • Donc, disons que j'ai 100 articles dans la liste.
  • 50 des 100 éléments de la liste correspondent à ma requête.
  • Je veux seulement obtenir 10 des 50 ans.
  • Comment puis-je obtenir le "50"?

    une simple requête:

    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;
    

Était-ce utile?

La solution

Ceci est un problème bien connu et très difficile à résoudre un problème, en particulier lorsqu'il s'agit de gros volumes de données. Même pas toucher SharePoint, vous avez peut-être remarqué que de nombreux systèmes (Google est un exemple évident) ne renvoient qu'un nombre approximatif d'éléments filtrés.

Fondamentalement, la seule chose que vous puissiez faire est d'effectuer la même requête, mais d'exclure les autorisations et tous les champs, à l'exception de l'ID des résultats. Donc, en termes de SQL, ce sera quelque chose comme ceci:

SELECT id FROM list WHERE (filter)

Si vous avez plus de 5 000 articles dans la liste (ou une autre valeur dépassant la valeur de réglage de la limite de «limite d'étranglement» que vous pouvez trouver dans les paramètres d'application Web), vous devrez mettre tous les champs qui participent à Le filtre à indexer (voir "Colonnes indexées" Lien sur la page "Liste des paramètres"), et Vous devrez Abandon filtrage par des champs de recherche (Ce sont des domaines des types suivants: recherche, métadonnées gérées, personnes et groupe, statut de workflow).

Il est également conseillé de limiter même cette requête par un grand nombre, par exemple, 100 000 articles ou quelque chose comme ça, de sorte que ce sera:

SELECT TOP 100000 id FROM list WHERE (filter)

Alors, comment il sera lu appliqué à 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
};

S'il vous plaît, gardez à l'esprit qu'il fonctionnera lentement si vous avez une grande quantité d'éléments ou si vous avez de lourdes (en termes de filtre SQL).

Autres conseils

Les requêtes en temps réel frappent les performances assez difficiles là-bas n'est pas un bon moyen de compter les articles dans une liste sans itération à travers eux.

Gardez également dans l'esprit élément et list.items.Count reviendra différents numéros dans certains cas.

Pour les grandes listes, il y a un raisonnement derrière cette décision: http://technet.microsoft.com/en-us/library/cc262813.côt

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top