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, содержащий информацию об элементах.
- namespace ZhukPoint.Portal2007.WebParts
 - {
 -   public class SiteQueryWebPart : Microsoft.SharePoint.WebPartPages.WebPart
 -   {
 -     protected override void CreateChildControls()
 -     {
 -       base.CreateChildControls();
 -       // Текущий контекст
 -       SPContext ctx = SPContext.Current;
 -       // GridView, который будет содержать информацию об элементах списка
 -       GridView gv = new GridView();
 -       // Чтоб не отваливалась, если нет прав
 -       SPSecurity.RunWithElevatedPrivileges(
 -         delegate
 -           {
 -             using (SPSite site = new SPSite(ctx.Site.ID))
 -             {
 -               // Запрос
 -               var siteQuery = new SPSiteDataQuery
 -               {
 -                 // Ищем элементы в списках
 -                 Lists = "<Lists BaseType=''0'' />",
 -                 // Выбираем поле "Название"
 -                 ViewFields = "<FieldRef Name=''Title'' />",
 -                 // Ищем по всем узлам
 -                 Webs = "<Webs Scope=''SiteCollection'' />",
 -                 // Ищем элементы конкретного типа
 -                 // Ищем элементы, созданные текущим пользователем
 -                 Query =
 -                   @"<Where>
 -                     <And>
 -                       <BeginsWith>
 -                         <FieldRef Name='ContentTypeId' />
 -                         <Value Type='Text'>0x010001A7BD983B790C41B06A3399D2E850D7</Value>
 -                       </BeginsWith>
 -                       <Eq>
 -                         <FieldRef Name='Author' />
 -                         <Value Type='User'><UserID Type='Integer'/></Value>
 -                       </Eq>
 -                     </And>
 -                   </Where>"
 -               };
 -               // Выполняем запрос. В результате получаем DataTable
 -               DataTable dt = site.RootWeb.GetSiteData(siteQuery);
 -               // "Привязываем" DataTable к GridView и заполняем его
 -               gv.DataSource = dt;
 -               gv.DataBind();
 -             }
 -           });
 -       // Добавляем GridView на страницу
 -       Controls.Add(gv);
 -     }
 -   }
 - }
 
В результате получаем: 
 Теперь немного изменим параметры запросы, чтобы получить информацию о документах, созданных текущим пользователем:
- ...
 - // Запрос
 - var siteQuery = new SPSiteDataQuery
 - {
 -   // Ищем элементы в библиотеках док-ов
 -   Lists = "<Lists BaseType='1' />",
 -   // Выбираем поле "Название", "Создан", "Версия"
 -   ViewFields = "<FieldRef Name='Title' /><FieldRef Name='Created' /><FieldRef Name='_UIVersionString' />",
 -   // Ищем по всем узлам
 -   Webs = "<Webs Scope='SiteCollection' />",
 -   // Ищем элементы, созданные текущим пользователем
 -   Query =
 -     @"<Where>
 -       <Eq>
 -         <FieldRef Name='Author' />
 -         <Value Type='User'><UserID Type='Integer'/></Value>
 -       </Eq>
 -     </Where>"
 - };
 - ...
 
В результате получим: 
 Более подробное о классе SPSiteDataQuery можно прочитать на MSDN.
 






















































































