Основное различие между SPQuery и SPSiteDataQuery заключается в указании списка для запроса. В отличие от SPQuery, в SPSiteDataQuery вы не можете указать заголовок списка, чтобы сузить запрос на каждом сайте, у вас есть только элемент Lists, который намного менее гибок. Винсент Ротвелл описывает все возможности здесь .
Эта негибкость означает, что использование BaseType = 1 в коде элемента Lists вернет документы из всех библиотек документов. Единственный способ избежать этого - развернуть пользовательский шаблон списка для Quality Documents
с его собственным идентификационным номером. После этого вы сможете использовать <Lists ServerTemplate='XYZ' />
(где XYZ - это идентификационный номер, чтобы сузить результаты до этого типа списка). В противном случае вам нужно будет отфильтровать полученные результаты, чтобы они содержали только записи из библиотеки Quality Documents
.
Помимо этого, ваш код выглядит эквивалентно. Вам также может понравиться CrossListQueryInfo и CrossListQueryCache , если вы используете MOSS. Это позволяет вам кэшировать запросы в стиле SPSiteDataQuery. См. этот пост Джеффа Далтона для хорошей информации по этому вопросу.
Обновление из комментариев об удалении объекта:
Ваш код будет пропускать объект SPSite - для этого также требуется условие использования. Замените строку использования, которая у вас есть на данный момент, этими строками:
using (SPSite oSite = new SPSite(properties.SiteId))
using (SPWeb oWeb = oSite.OpenWeb(properties.RelativeWebUrl))
{
// Your code
}
Кроме того, SPDisposeCheck легко использовать. Для интеграции с Visual Studio добавьте следующую строку в событие пост-сборки вашего проекта:
"% ProgramFiles% \ Microsoft \ SharePoint
Dispose Check \ SPDisposeCheck.exe "
$ (TargetPath)
Сборка теперь не удастся, если у вас есть утечки памяти. Проверьте окно вывода для деталей о том, где они находятся. Обратите внимание, что SPDisposeCheck иногда сообщает о ложных срабатываниях, и их можно игнорировать (прочитайте документацию, чтобы узнать, как это сделать).