如何用一种快速的方法做到这一点?

问题描述

| 我正在为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的搜索引擎。这将使您快速索引所有文档以及需要提取的值。对于您需要计算的每个文档值,在中央管理中添加一个托管元数据属性。 唯一的缺点是,这不会提供最新的结果。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...