Recherche dans une liste avec les folders
Avec SharePoint 2010, nous avons essayé de résoudre le problème de la limite qui s’imposait sur les listes. C’est dans ce contexte que les folders sont apparus.
Pour rappeler, les folders sont une sorte de sous-liste dans une liste. Ils permettent de regrouper des éléments dans une seule entité.
Cela dit, si nous devons chercher des éléments dans plusieurs folders, un souci de performance se présente. Deux moyens s’offrent à nous : faire une recherche récursive sur toute la liste (cela impose d’augmenter la limite d’affiche de la liste) où une recherche dans chaque folder.
Nous prenons cet exemple :
Une liste avec 5 Folders et dans chacun d’eux, 6000 éléments.
SPWeb web = SPContext.Current.Site.OpenWeb("/");
web.AllowUnsafeUpdates = true;
// Création de la liste
Guid listGuid = web.Lists.Add(listName, "Une liste personnalisée pour les tests de monter en charge", SPListTemplateType.GenericList);
// Récupérer la liste
SPList list = web.Lists[listGuid];
list.OnQuickLaunch = true;
//ajouter une colonne de type Nombre
list.Fields.Add("Value", SPFieldType.Number, false);
// Et on enregistre le tout
list.Update();
// création des 5 folders
for (int i = 0; i < 5; i++)
{
SPListItem folder = list.Items.Add("", SPFileSystemObjectType.Folder, "Folder - " + i);
folder.Update();
// ajout des éléments à la liste
for (int j = 0; j < 6000; j++)
{
SPListItem item = list.Items.Add(web.Url + "/" + folder.Url, SPFileSystemObjectType.File);
item["Title"] = "Titre - " + j;
item["Value"] = j;
item.Update();
}
}
web.AllowUnsafeUpdates = false;
Nous exécutons après les deux méthodes de recherche. La première effectue une recherche récursive :
String message = String.Empty;
String valeur = "5";
SPQuery spQ = new SPQuery();
spQ.Query = "<Where>"
+ " <Eq>"
+ " <FieldRef Name='Value' />"
+ " <Value Type='Number'>" + valeur + "</Value>"
+ " </Eq>"
+ "</Where>";
spQ.ViewAttributes = "Scope='Recursive'";
SPWeb web = SPContext.Current.Site.OpenWeb("/");
SPList spL = web.Lists[listName];
DateTime t1 = DateTime.Now;
SPListItemCollection itemsCol = spL.GetItems(spQ);
DateTime t2 = DateTime.Now;
message = "Temps écoulé: " + (t2 - t1) ;
Et la deuxième effectue une recherche sur les folders :
String message = String.Empty;
String valeur = "5";
SPQuery spQ = new SPQuery();
spQ.Query = "<Where>"
+ " <Eq>"
+ " <FieldRef Name='Value' />"
+ " <Value Type='Number'>" + valeur + "</Value>"
+ " </Eq>"
+ "</Where>";
SPWeb web = SPContext.Current.Site.OpenWeb("/");
SPList spL = web.Lists[listName];
SPListItemCollection itemsCol0 = null;
DateTime t1 = DateTime.Now;
for (int i = 0; i < spL.Folders.Count; i++)
{
spQ.Folder = spL.Folders[i].Folder;
itemsCol0 = spL.GetItems(spQ);
}
DateTime t2 = DateTime.Now;
message = "Temps écoulé: " + (t2 - t1);
Nous obtenons ainsi les résultats suivants:
| Récursive | Folders | |
| Temps écoulé | < 1 seconde | > 5 secondes |
Dans ce cas, la recherche récursive prend beaucoup moins de temps qu’une recherche sur chaque folder.
L’utilisation de l’une des deux méthodes est justifiée par un objectif de performance et par les choix de l’administrateur sur les limites imposées aux listes SharePoint.




