Obtenez SPQUERY TOTALITEMS DE QUERY
-
10-12-2019 - |
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;
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
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