Получение всех веб-страниц SPWeb и дочерних веб-сайтов, имеющих поле со значением в Sharepoint? - PullRequest
1 голос
/ 09 марта 2009

У меня есть веб-сайт в 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();
                              }

Ответы [ 2 ]

2 голосов
/ 10 марта 2009

Наконец я сделал следующее, я не знаю, что сработало, наконец, я изменил способ, которым я запрашиваю списки, и включил RowLimit:

DataTable dt = null; DataView dv = null;

    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' /></OrderBy>";
    qry.Webs = "<Webs Scope='Recursive'/>";
    qry.Lists = "<Lists ServerTemplate='850' Hidden='FALSE' MaxListsLimit='50'/>";
    qry.RowLimit = 3;

    qry.ViewFields = "<FieldRef Name='Title'/><FieldRef Name='Modified'/><FieldRef Name='FileRef'/>";

    using (SPSite site = new SPSite(CurrentSite.ID, GetSystemToken(CurrentSite)))
    {
        using (SPWeb web = site.OpenWeb(webUrl))
        {   
            dt = web.GetSiteData(qry);

            dv = dt.DefaultView;

        }
    }

    return dv;
1 голос
/ 09 марта 2009

Вы говорите об установке рекурсивной области веб-страниц, но в своем (плохо отформатированном) примере кода свойство веб-страниц оставлено пустым, то есть запрос данных сайта будет выполнять поиск только в указанной сети.

Эта конкретная (опущенная) деталь вашего кода очень важна, потому что даже малейшая орфографическая ошибка в спецификации innerXML вернет поведение по умолчанию обратно, то есть только текущая сеть поиск. Типичной ошибкой было бы неправильное использование заглавных букв в вебах или области видимости.

Для справки, правильный способ указать это

qry.Webs = "<Webs Scope='Recursive' />";

В качестве быстрой проверки вы можете попробовать установить область для SiteCollection, посмотреть, работает ли она.

[Редактировать] Согласен, теперь ваше свойство веб-страниц отображается нормально :-). Вы пытались установить атрибут Nullable = 'TRUE' в fieldref поля Campo? Если поле отсутствует (или повреждено, или что-то еще) ни на одном из дочерних сайтов, это может помочь. [/ Edit]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...