2010-06-22 3 views
1

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); 
    } 
} 

Répondre

1

trouvé celui-ci en ligne.

public static bool GroupExists(SPGroupCollection groups, string name) 
{ 
    if (string.IsNullOrEmpty(name) || (name.Length > 255) || (groups == null) || (groups.Count == 0)) 
    { 
     return false; 
    } 
    else 
    { 
     return (groups.GetCollection(new String[] { name }).Count > 0); 
    } 
} 

Il semble plus efficace mais je ne vais pas être en mesure de tester ce jusqu'à ce un processus automatisé se termine en 20 minutes.

+1

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 –

Questions connexes