问题描述
|
我正在为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,folderNode.UniqueId,SPAuditItemType.Folder);
}
SPFolder subfolder = folder.SubFolders[j];
GetFolderNode(db,subfolder);
}
}
因此,当我执行CalculateValues
方法时,它花费的时间太长,有时甚至无法完成,因为它抛出了OutOfMemory exception
(也许有一些未处置的对象?)。
有人知道这样做的更快方法吗?我真的不知道还能尝试什么。
解决方法
如果必须分别访问每个项目,则将无法使该功能运行得更快。
最好的选择是利用SharePoint的搜索引擎。这将使您快速索引所有文档以及需要提取的值。对于您需要计算的每个文档值,在中央管理中添加一个托管元数据属性。
唯一的缺点是,这不会提供最新的结果。