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.