Запрос к библиотеке SharePoint работает очень медленно - PullRequest
2 голосов
/ 09 марта 2012

У нас есть запрос SharePoint, работающий с библиотекой из, возможно, 500 документов, чтобы получить самую высокую версию опубликованных документов, помеченных как активные (имейте active = true в столбце Active).

Это занимает слишком много времени для запуска (около 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 Ответ

1 голос
/ 10 марта 2012

Несколько баллов:

  • Разве HasPublishedVersion и file.Item.Versions не выполняют одно и то же - проверяет, существует ли опубликованная версия SPFile?
  • Запрос Any в SPListItemVersions будет искать их в порядке от Версии [0] до Версии [count - 1], что переводится как «от самого нового до самого старого» (поскольку Versions [0] - самая последняя версия в SP). Если вы считаете, что скорее всего ваши документы публиковались вскоре после создания чаще, чем они были в последнее время, возможно, будет быстрее выполнить ту же проверку, выполняя цикл назад по коллекции (от самой старой версии к самой новой).
  • Вы можете индексировать столбец Active.
  • Вы можете оптимизировать его, выполнив часть запроса с использованием CAML (я знаю, это ужасно). Я бы попытался делегировать выборку SPFile и проверку Active для запроса CAML, а затем выполнить остальную часть, используя объектную модель. Смотрите эту ссылку
  • Если вы используете CAML, PortalSiteMapProvider.GetCachedListItemsByQuery () может оказаться быстрее SPList.GetItems ().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...