У меня есть веб-сайт в Sharepoint 2007. Я хочу сделать запрос, в котором поле «home» веб-страниц равно 1 в одном конкретном SPWeb и (это важная часть) его дочерних SPweb. Я могу заставить это работать с рассматриваемым сайтом, а не с дочерними сайтами. То есть: он не рекурсивный, но я указываю это в предложении «webs scope = 'recursive'».
Я также включаю Список, который хочу использовать, то есть страницы (не документы, главные страницы или что-то еще), поэтому я ищу базовый шаблон «850» (тот, который предназначен для страниц).
Код, который я использую, следующий (я пробовал использовать другие методы с тем же запросом, и результат тот же):
string campo="home"; SPSiteDataQuery qry = new SPSiteDataQuery(); qry.Query = "<Where><Eq><FieldRef Name='"; qry.Query += campo + "'/><Value
Type='Boolean'>1</Value></Eq>";
qry.Query += "</Where><OrderBy><FieldRef
Name = 'Modified' Ascending = 'false'> /> ";
qry.Webs = "<Webs Scope='Recursive'/>";
qry.ViewFields = "<FieldRef Name='Title'/><FieldRef
Name = 'Изменено' /> ";
//this gives me system privileges using (SPSite site = new SPSite(CurrentSite.ID,
GetSystemToken (CurrentSite))) {
using (SPWeb web = site.OpenWeb("/News/")) { StringBuilder sb = new StringBuilder(); sb.Append("<Lists>"); foreach (SPList list in web.Lists) { if (list.BaseTemplate.ToString() ==
"850") {
sb.Append("<List ID=\"" +
list.ID.ToString () + "\" /> ");
} } sb.Append("</Lists>"); qry.Lists = sb.ToString(); dt = web.GetSiteData(qry); ..................
Итак, единственное решение, которое я нашел, - это создать цикл после прецедентного кода через Webs, но я не думаю, что это очень оптимизированный способ:
foreach (SPWeb w2 in web.Webs)
{
sb = new StringBuilder();
sb.Append("<Lists>");
foreach (SPList list in w2.Lists)
{
if (list.BaseTemplate.ToString()
== "850")
{
sb.Append("<List ID=\""
+ list.ID.ToString() + "\"/>");
}
}
sb.Append("</Lists>");
qry.Lists = sb.ToString();
DataTable dttmp = w2.GetSiteData(qry);
if (dttmp != null
&& dttmp.Rows.Count > 0)
{
dt.Merge(dttmp);
}
w2.Dispose();
}