2012-03-09 291 views
2

我們有一個SharePoint查詢可能運行在500個文檔的庫上,以撤回標記爲活動(Active列中的active = true)的已發佈文檔的最高版本。SharePoint庫查詢運行速度很慢

這段時間過長(約3-5秒),令用戶感到沮喪。

什麼可以做下面的查詢加快它(我希望這是幾乎瞬間!)

using (var site = new SPSite(Helpers.ConfigurationFile.SharePointUrl().ToString())) 
{ 
    using (var web = site.RootWeb) 
    { 
     return 
      web.Folders["Templates"].Files.OfType<SPFile>() 
      .Where(file => file.Item.HasPublishedVersion) 
      .Where(file => file.Item.Properties["Active"].ToString() == "true") 
      .Where(file => file.Item.Versions.OfType<SPListItemVersion>() 
       .Any(x => x.Level == SPFileLevel.Published)) 
      .Select(file => new LibraryItem(
             file.Item.UniqueId, 
             file.Item.ID, 
             file.Item.Title, 
             Helpers.ConfigurationFile.SharePointUrl() 
              .ToString().AddPathSegment(file.Url), 
             true, 
             float.Parse(file.MajorVersion.ToString() 
             + "." + file.MinorVersion.ToString()) 
            ) 

        ) 
      .ToList(); 
    } 
} 

回答

1

的幾點:

  • 不是HasPublishedVersion和file.Item.Versions檢查是否做同樣的事情 - 檢查SPFile的發佈版本是否存在?
  • SPListItemVersions上的Any查詢將按照從版本[0]到版本[count - 1]的順序進行搜索,這會轉換爲'從最新到最舊'(因爲版本[0]是SP中的最新版本)。如果您認爲您的文檔在創建後可能比近期更頻繁地發佈,那麼通過向後循環(從最舊版本到最新版本)執行相同的檢查可能會更快。
  • 您可以在活動列上編制索引。
  • 您可以通過使用CAML執行部分查詢來優化它(這很恐怖,我知道)。我會嘗試將SPFile抓取和主動檢查委派給CAML查詢,然後使用對象模型完成其餘部分。請參閱this link
  • 如果確實使用CAML,PortalSiteMapProvider.GetCachedListItemsByQuery()可能會證明SPList.GetItems()更快。
+0

在關閉部分查詢之後,它是引用放慢查詢的文件版本的行(LINQ變爲每個已發佈文檔的單獨查詢)。我不認爲我可以訪問CAML中的文件版本,所以我認爲我最好的選擇是重寫代碼以檢索已發佈的文檔,然後在用戶選擇文檔後獲取特定的版本信息。感謝回覆! – 2012-03-23 16:19:59