2011-06-15 55 views
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(也許有一些未定義的對象?)。

有誰知道這樣做的一個更快的方法?我真的不知道還有什麼要嘗試。

+0

如果您能告訴我們業務需求,我們可以尋找更好的解決方案。是的,你有一些物品不處理。您始終可以使用SPDisposeCheck工具清理代碼。 – NLV 2011-06-15 05:26:24

+0

您需要知道的相關信息是,我需要一種方法,在這種情況下稱爲CalculateValues,它在文件之間執行某些數學運算。 – 2011-06-15 12:29:56

回答

0

您將無法使該功能可以跑得快一點,如果你有單獨訪問每個項目。

最好的辦法是利用SharePoint的搜索引擎。這將爲您提供所有文檔的快速索引和您需要提取的值。對於需要計算的每個文檔值,請在中央管理中添加託管元數據屬性。

唯一的缺點是,這將不會提供最新的一分鐘的結果。

相關問題