У меня есть веб-сайт в Sharepoint 2007. Я хочу сделать запрос, где поле "home" веб-страниц равно 1 в одном конкретном SPWeb и (это важная часть) его подчиненных SPwebs.
Я могу сделать эту работу с рассматриваемым сайтом, а не с подсайтами. То есть: он не является рекурсивным, но я указываю это в предложении "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 = 'Modified' /> ";
//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);
..................
Итак, единственное решение, которое я нашел, было сделать цикл после кода прецедента через Веб, но я не думаю, что это очень оптимизированный способ:
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();
}