In SharePoint 2010 bietet die API die neue Klasse ContentIterator, mit deren Hilfe es möglich ist, auf unterschiedlichen Ebenen durch alle Inhalte zu iterieren.

Der Vorteil gegenüber einem einfachen “foreach” ist, dass eine automatische Lastbegrenzung enthalten ist, damit der aktuelle Vorgang nicht zu viel Leistung benötigt und so evtl. Teile der SharePoint Farm lahm legt. Dies ist z.B. besonders für Timerjobs geeignet, die regelmäßig auf alle (oder viele) Elemente eines bestimmten Bereichs zugreifen.

Und so wird die Klasse genutzt um alle Site Collections einer Web Application zu durchlaufen:

SPWebApplication webApplication = SPWebApplication.Lookup(new Uri("http://dev.hansevision.de"));
ContentIterator iterator = new ContentIterator();

// iterate through site collections
iterator.ProcessSites(webApplication.Sites,
    delegate(SPSite spSite)
    {
        // your code to process site collection
    },
    delegate(SPSite spSite, Exception ex)
    {
        // your code to handle the exception
        // return true to re-throw exception, false proceed with processing
        return true;
    });

Iteration durch alle Sites einer Site Collection:

iterator.ProcessSite(spSite,
    delegate(SPWeb spWeb)
    {
        // your code to process the site        
    },
    delegate(SPWeb spWeb, Exception ex)
    {
        // your code to handle the exception
        // return true to re-throw exception, false proceed with processing
        return true;
    });

Iteration durch Listen:

// iterate through lists
iterator.ProcessLists(spWeb.Lists,
    delegate(SPList list)
    {
        // your code to process the list  
    },
    delegate(SPList list, Exception ex)
    {
        // your code to handle the exception
        // return true to re-throw exception, false proceed with processing
        return true;
    });

Iteration durch Listeneinträge:

// iterate through Items
iterator.ProcessListItems(spList,
    delegate(SPListItem item)
    {
        // your code to process the item 
    },
    delegate(SPListItem item, Exception ex)
    {
        // your code to handle the exception
        // return true to re-throw exception, false proceed with processing
        return true;
    });

Für die Iteration durch Listenelemente können weitere Methoden der Klasse genutzt werden, die z.B. mit einer SPQuery zusammenarbeiten.

iterator.ProcessItems(list.GetItems(query), …)

Es ist auch möglich diese einzelnen Blöcke zu schachteln, das könnte z.B. so aussehen um alle Listen in allen Sites zu durchlaufen:

// iterate through sites
iterator.ProcessSite(spSite,
    delegate(SPWeb spWeb)
    {
        // iterate through lists
        iterator.ProcessLists(spWeb.Lists,
            delegate(SPList list)
            {
                // your code to process the list  
            },
            delegate(SPList list, Exception ex)
            {
                // your code to handle the exception
                // return true to re-throw exception, false proceed with processing
                return true;
            });        
    },
    delegate(SPWeb spWeb, Exception ex)
    {
        // your code to handle the exception
        // return true to re-throw exception, false proceed with processing
        return true;
    });

Weitere Informationen in der MSDN: ContentIterator Class (Microsoft.Office.Server.Utilities)

Technorati-Markierungen: ,

Leave a comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.