2
我正在爲SharePoint 2010構建一個Web部件,該Web部件通過SharePoint網站的整個網站集進行迭代,並且對於文檔庫中的每個文件,它將爲在該網站上註冊的每個用戶保存一個值。爲了記錄,有超過一百個用戶。如何用快速方法做到這一點?
到目前爲止,我已經試過下面的代碼:
public static void CalculateValues(MyDataContext db, string siteUrl)
{
SPWebCollection webCollection = new SPSite(siteUrl).AllWebs;
Guid docLibFeatId = new Guid("00bfea71-e717-4e80-aa17-d0c71b360101");
List<int> user_ids = (from u in db.Users
select u.Id).ToList();
foreach (SPWeb web in webCollection)
{
foreach (SPList list in docLibraryColl)
{
if (list.TemplateFeatureId == docLibFeatId && !list.Hidden)
{
SPDocumentLibrary docLib = (SPDocumentLibrary)list;
SPFolder root = docLib.RootFolder;
TrackingUtility.GetFolderNode(db, user_ids, web, root);
}
}
web.Dispose();
}
}
public static List<SPFolder> GetFoldersInFolder(CogitoRecommendationsDataContext db, SPFolder folder)
{
List<SPFolder> result = new List<SPFolder>();
SPFolderCollection subFolders = folder.SubFolders;
foreach (SPFolder subFolder in subFolders)
{
result.Add(subFolder);
}
return result;
}
public static void GetFolderNode(CogitoRecommendationsDataContext db, List<int> user_ids, SPWeb web, SPFolder folder)
{
List<SPFolder> folders = GetFoldersInFolder(db, folder);
for (int j = 0; j <= folders.Count - 1; j++)
{
SPFolder folderNode = folders[j];
foreach (var id in user_ids)
{
SPUser spUser = web.AllUsers.GetByID(id);
SaveValue(db, spUser, web, folderNode.UniqueId, SPAuditItemType.Folder);
}
SPFolder subfolder = folder.SubFolders[j];
GetFolderNode(db, user_ids, web, subfolder);
}
}
所以,當我執行CalculateValues
方法,它的時間太長它完成,有時甚至沒有完成,因爲它會拋出一個OutOfMemory exception
(也許有一些未定義的對象?)。
有誰知道這樣做的一個更快的方法?我真的不知道還有什麼要嘗試。
如果您能告訴我們業務需求,我們可以尋找更好的解決方案。是的,你有一些物品不處理。您始終可以使用SPDisposeCheck工具清理代碼。 – NLV 2011-06-15 05:26:24
您需要知道的相關信息是,我需要一種方法,在這種情況下稱爲CalculateValues,它在文件之間執行某些數學運算。 – 2011-06-15 12:29:56