Skip to content
11 oct / Hamdi MLAOUHI

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.

No TweetBacks yet. (Be the first to Tweet this post)
Laisser un commentaire

Notifiez-moi les commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.