Получаем коллекцию элементов списка из различных списков разных веб-узлов. 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.
Комментариев нет:
Отправить комментарий