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:
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:
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.