2012-03-09 186 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