sábado, 26 de julio de 2014

Simple tip de desarrollo: SPSite.AllWebs vs SPWeb.Webs

SPSite.AllWebs retorna los subsites inmediatos del sitecollection y todos sus subsites (en otras palabras, todo los web recursivamente dentro del site collection); SPWeb.Webs tiene un alcance más limitado, sólo retorna el primer nivel de subsitios del objeto SPWeb.

En el caso que te pidan obtener todos los subsites de un site collection (hasta el último nivel) puedes hacerlo de forma recursiva con el objeto SPWeb.Webs o mediante el objeto AllWebs. Veamos un ejemplo con SPWeb.Webs

public void BuscarWebSites(SPSite site)
{
    using (var web = site.RootWeb)
    {
        ProcesarRecursivamente(web);
    }
}

//Metodo recursivo
private static void ProcesarRecursivamente(SPWeb web)
{
    //hago el uso del objeto
    foreach (SPWeb subWeb in web.Webs)
    {
        using (subWeb)
        {
            ProcesarRecursivamente(subWeb);           
        }
    }
}

Ahora veamos un ejemplo con SPSite.AllWebs

public void BuscarWebSites(url sitecollection)
{    using(SPSite site = new SPSite(sitecollection) 
    { 
        foreach(SPWebInfo webInfo in site.AllWebs.WebsInfo) 
        {
            var result = webInfo.Title +
               webInfo.ServerRelativeUrl +
               webInfo.Description +
               webInfo.Id +
               webInfo.Language +
               webInfo.LastItemModifiedDate +
               webInfo.WebTemplateId +
               webInfo.Configuration +
               webInfo.UIVersionConfigurationEnabled +
               webInfo.UIVersion +
               webInfo.MasterUrl +
               webInfo.CustomMasterUrl;
        } 
    } 
}

Cuando se usa SPSite.AllWebs se usa menos memoria, ya que carga sólo un web site a la vez.

También miren que use la propiedad WebsInfo, esto se debe a que carga la información más importante (title, description, URL, Web template identifier, configuration identifier, last-modified time, UI version, status flags, master URL, y custom master URL). Esto difiere del siguiente ejemplo

foreach (SPWeb web in site.AllWebs)
{
Console.WriteLine(web.Description + “: ” + web.Title);
web.Dispose();
}

ya que este ejemplo carga de forma lazy (lazy loading) la propiedad Description, yendo de nuevo a la base de datos a buscar el ejemplo.

TIP: siempre usa SPSite.AllWebs.WebsInfo

No hay comentarios:

Publicar un comentario