Как сделать это быстрым методом? - PullRequest
2 голосов
/ 15 июня 2011

Я создаю веб-часть для SharePoint 2010, которая выполняет итерацию по всему семейству сайтов сайта 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 (может быть, есть какой-то нерасположенный объект?).

Кто-нибудь знает, как быстрее сделать это?Я действительно не знаю, что еще попробовать.

1 Ответ

0 голосов
/ 13 июля 2011

Вы не сможете запустить эту функцию быстрее, если вам нужно получить доступ к каждому элементу по отдельности.

Лучше всего использовать поисковую систему SharePoint.Это даст вам быстрый индекс для всех документов и значений, которые вы должны получить.Для каждого значения документа, которое вам нужно вычислить, добавьте свойство управляемых метаданных в центральном администраторе.

Единственный недостаток - это то, что он не будет предоставлять самые последние результаты.

...