Je me suis finalement aventuré loin de la terre de PowerShell en C# pour SharePoint. J'ai créé un webpart, que je vais décrire un peu, qui fonctionne parfaitement sur mon serveur de développement mais qui tourne lentement sur ma production. La différence est que mon serveur de production a plus de 1400 groupes alors que le développement n'en compte que 20 environ.Webpart accédant à une grande liste de groupes
Mon composant WebPart a été créé pour résoudre un problème courant: un utilisateur doit cliquer trop de fois pour accéder à ses éléments. J'ai une bibliothèque de documents qui a 12 catégories principales avec de nombreux sous-dossiers en dessous. Chaque sous-dossier correspond pour la plupart à un groupe SharePoint réel. Pour chaque catégorie principale, j'obtiens un tableau de tous les sous-dossiers et je fais une boucle pour voir si ce groupe existe. Maintenant, dans mon code ci-dessous, je sais ce qui le ralentit.
Existe-t-il un moyen plus simple de voir si un groupe existe plutôt que d'interroger la liste entière du groupe à chaque fois? Je pourrais potentiellement interroger cette liste environ 650 fois.
Voici mon code:
protected override void RenderWebPart(HtmlTextWriter output)
{
try
{
#region Connect to the Current Site
using (SPSite siteCollection = SPContext.Current.Site)
{
#region Connect to the tab we want to have this done on
using (SPWeb oWebsite = siteCollection.OpenWeb("Downloads"))
{
#region Find all the items in the list
foreach (SPListItem item in oWebsite.GetList(oWebsite.ServerRelativeUrl + "/My Files").GetItems(new SPQuery()))
{
string type = Convert.ToString(item["Type"]);
string name = Convert.ToString(item["Name"]);
#region If this is a legit folder
if ((String.IsNullOrEmpty(type)) && (name != "Archived") && (name != "Other"))
{
#region Get all the sub folders for each main folder
foreach (SPFolder SFolder in item.Folder.SubFolders)
{
#region Then get a list of all groups in SharePoint
foreach (SPGroup part in oWebsite.Groups)
{
#region Then check to see if there is a group with the same name as the folder
if (SFolder.Name == part.Name)
{
#region Then check to see if the user is in that group
foreach (SPUser vUser in part.Users)
{
string redirectURL = oWebsite.Url + "/My FIles/" + item.Name + "/" + part.Name;
string QSURL = oWebsite.Url + "/My Files/" + item.Name;
bool IsOwner = oWebsite.AssociatedOwnerGroup.ContainsCurrentUser;
bool IsQueryStringNull = String.IsNullOrEmpty(this.Page.Request.QueryString["RootFolder"]);
if ((oWebsite.CurrentUser.ID == vUser.ID) && (IsQueryStringNull))
{
if (IsOwner) { output.Write("If you were not an admin you would be redirected to:" + redirectURL + "<br>"); }
else { this.Page.Response.Redirect(redirectURL, true); }
}
else if ((oWebsite.CurrentUser.ID == vUser.ID) && (!IsQueryStringNull) && (!IsOwner))
{
if (QSURL == this.Page.Request.QueryString["RootFolder"]) { this.Page.Response.Redirect(redirectURL, true); }
else if (redirectURL == this.Page.Request.QueryString["RootFolder"]) { output.Write("User is at the right place :)<br>"); }
else { output.Write("Not Redirecting users: QS is not empty<br>"); }
}
}
#endregion
}
#endregion
}
#endregion
}
#endregion
}
#endregion
}
#endregion
}
#endregion
}
#endregion
}
catch (Exception ex)
{
output.Write("ERROR: " + ex);
}
}
SharePoint (2007, pas encore sur 2010) n'a pas de moyen OTB pour vérifier si un groupe existe. L'extrait de code que vous avez ressemble à une bonne approche –