SharePoint 2007. Получение данных из нескольких списков и узлов

Что делаем

Получаем коллекцию элементов списка из различных списков разных веб-узлов. CrossList-CrossWeb. Как-то так.
Для конкретизации исходных данных сделаем:

  • три дочерних узла (web01, web02, web03) в корневом узле;
  • список на каждом из этих узлов;
  • тип содержимого Public ListItem. Будем искать элементы этого типа;
  • несколько элементов типа Public ListItem на каждом из созданных списков, предварительно добавив этот тип содержимого в списки.

Попробуем отобразить информацию об этих элементах в веб-парте на корневом узле.

Зачем

Например для получения списка документов, измененных текущим пользователем за последнюю неделю. Или, если элементы одно и тоже типа располагаются в различных списках (например, в списках "Договора 2008", "Договора 2009", ...)

Что понадобится

Для формирования запроса будем использовать SPSiteDataQuery. Для получения элементов будем вызывать метод GetSiteData класса SPWeb и передавать туда наш запрос.
В классе SPSiteDataQuery нас интересуют следующие его свойства:

  • Lists. содержит информацию о списках, по которым будет осуществлять поиск;
  • ViewFields. содержит список полей, которые попадут в результирующий набор. Поля WebId, SiteId и ID включаются в список по-умолчанию (содержимое полей понятно из названия);
  • Webs. содержит информацию о веб-узлах, по спискам (библиотекам) которых будет осуществляться поиск;
  • Query сам запрос для фильтрации элементов в списках.

Для того чтобы добавить в список тип содержимого надо:

  • перейти на страницу параметров списка;
  • перейти по ссылке Дополнительные параметры;
  • разрешить управление типами содержимого:

Реализация

Сделаем веб-части, которая будет отображать GridView, содержащий информацию об элементах.

  1. namespace ZhukPoint.Portal2007.WebParts
  2. {
  3.   public class SiteQueryWebPart : Microsoft.SharePoint.WebPartPages.WebPart
  4.   {
  5.     protected override void CreateChildControls()
  6.     {
  7.       base.CreateChildControls();
  8.       // Текущий контекст
  9.       SPContext ctx = SPContext.Current;
  10.       // GridView, который будет содержать информацию об элементах списка
  11.       GridView gv = new GridView();
  12.       // Чтоб не отваливалась, если нет прав
  13.       SPSecurity.RunWithElevatedPrivileges(
  14.         delegate
  15.           {
  16.             using (SPSite site = new SPSite(ctx.Site.ID))
  17.             {
  18.               // Запрос
  19.               var siteQuery = new SPSiteDataQuery
  20.               {
  21.                 // Ищем элементы в списках
  22.                 Lists = "<Lists BaseType=''0'' />",
  23.                 // Выбираем поле "Название"
  24.                 ViewFields = "<FieldRef Name=''Title'' />",
  25.                 // Ищем по всем узлам
  26.                 Webs = "<Webs Scope=''SiteCollection'' />",
  27.                 // Ищем элементы конкретного типа
  28.                 // Ищем элементы, созданные текущим пользователем
  29.                 Query =
  30.                   @"<Where>
  31.                     <And>
  32.                       <BeginsWith>
  33.                         <FieldRef Name='ContentTypeId' />
  34.                         <Value Type='Text'>0x010001A7BD983B790C41B06A3399D2E850D7</Value>
  35.                       </BeginsWith>
  36.                       <Eq>
  37.                         <FieldRef Name='Author' />
  38.                         <Value Type='User'><UserID Type='Integer'/></Value>
  39.                       </Eq>
  40.                     </And>
  41.                   </Where>"
  42.               };
  43.               // Выполняем запрос. В результате получаем DataTable
  44.               DataTable dt = site.RootWeb.GetSiteData(siteQuery);
  45.               // "Привязываем" DataTable к GridView и заполняем его
  46.               gv.DataSource = dt;
  47.               gv.DataBind();
  48.             }
  49.           });
  50.       // Добавляем GridView на страницу
  51.       Controls.Add(gv);
  52.     }
  53.   }
  54. }

В результате получаем: Теперь немного изменим параметры запросы, чтобы получить информацию о документах, созданных текущим пользователем:

  1. ...
  2. // Запрос
  3. var siteQuery = new SPSiteDataQuery
  4. {
  5.   // Ищем элементы в библиотеках док-ов
  6.   Lists = "<Lists BaseType='1' />",
  7.   // Выбираем поле "Название", "Создан", "Версия"
  8.   ViewFields = "<FieldRef Name='Title' /><FieldRef Name='Created' /><FieldRef Name='_UIVersionString' />",
  9.   // Ищем по всем узлам
  10.   Webs = "<Webs Scope='SiteCollection' />",
  11.   // Ищем элементы, созданные текущим пользователем
  12.   Query =
  13.     @"<Where>
  14.       <Eq>
  15.         <FieldRef Name='Author' />
  16.         <Value Type='User'><UserID Type='Integer'/></Value>
  17.       </Eq>
  18.     </Where>"
  19. };
  20. ...

В результате получим: Более подробное о классе SPSiteDataQuery можно прочитать на MSDN.

Виталий Жуков

Виталий Жуков

Техлид, Архитектор, Разработчик, Microsoft MVP. Более 20 лет опыта в области системной интеграции и разработки программного обеспечения. Специализируюсь на проектировании и внедрении масштабируемых высокопроизводительных программных решений в различных отраслях.

Смотрите также