Laut der MSDN-Entwickler Referenz soll die Eigenschaft “Item” der Klasse “SPFolder” dazu dienen, das SharePoint Listenelement zurückzuliefern, das hinter eine Ordner (SPFolder Objekt) steht:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfolder.item.aspx

Das funktioniert auch wunderbar, so lange man sich in relative kleinen Dokumentbibliotheken befindet. In einem aktuellen Kundenprojekt wollte ich diesen Ansatz in einer Bibliothek nutzen, in der ca. 40.000 Ordner und ca. 90.000 Dokumente vorhanden sind.

Der (erste) Aufruf von “SPFolder.Item” dauert auf einmal wesentlich länger, wie der folgende Ausgabe-Screenshot zeigt:

image

Der Code dahinter sieht wie folgt aus:

string folderUrl = "http://hansevision/List1/Folder1";

using (SPSite site = new SPSite(folderUrl))
{
    using (SPWeb web = site.OpenWeb())
    {
        SPList list = web.GetList(folderUrl);
        SPFolder folder = web.GetFolder(folderUrl);

        Console.WriteLine("SPFolder.Item started at " + DateTime.Now);
        Console.WriteLine("SPListItem.ID: " + folder.Item.ID);
        Console.WriteLine("SPFolder.Item finished at " + DateTime.Now);
    }
}

Mit einem kleinen Workaround kommt man dennoch an die benötigte Information und das bei sehr guter Geschwindigkeit (Veränderung bei der Ausgabe der ID des Listenelements):

string folderUrl = "http://hansevis05/Test1/Folder1";

using (SPSite site = new SPSite(folderUrl))
{
    using (SPWeb web = site.OpenWeb())
    {
        SPList list = web.GetList(folderUrl);
        SPFolder folder = web.GetFolder(folderUrl);

        Console.WriteLine("SPFolder.Item started at " + DateTime.Now);
        Console.WriteLine("SPListItem.ID: " + web.GetListItem(folderUrl).ID);
        Console.WriteLine("SPFolder.Item finished at " + DateTime.Now);
    }
}

Das Laden des Listenelementes mit Hilfe der Url macht den Unterschied! Nun kommt man auf wesentlich bessere Antwortzeiten:

image

Im Hintergrund passiert folgendes: Während SPFolder.Item mit Hilfe einer SPQuery auf der Liste versucht das Element nach Namen zu suchen und abzurufen, greift SPWeb.GetListItem direkt anhand der Url auf die Metadaten zu und lädt das Element per ID aus der Liste. Dieser Unterschied bringt die Verbesserung in der Geschwindigkeit.

1 Comments

  1. Pingback: Aus der Praxis – Performance Problem in SharePoint bei der Verwendung der Eigenschaft “Item” aus der Klasse “SPFolder” - SharePoint Blogs in German - Bamboo Nation

Leave a comment

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

Time limit is exhausted. Please reload the CAPTCHA.