获取SPWeb的所有网页以及在Sharepoint中具有值的字段的子网站?

时间:2009-03-09 19:27:03

标签: sharepoint sharepoint-2007

我在Sharepoint 2007中有一个网站。我想进行查询,其中网页的“主页”字段在一个特定的SPWeb中等于1,并且(这是其重要部分)其子SPwebs。 我可以使用有问题的网站,而不是子网站。也就是说:它不是递归的,而是我在“webs scope ='recursive'”子句中指出它。

我还包括我想要使用的列表,也就是说,页面(不是文档,母版页或其他),这是我寻找“850”basetemplate(页面的那个)。

我正在使用的代码是这个(我已尝试使用相同查询的其他方法,结果是相同的):

  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
     

名称='已修改'升序='假'&gt; /&gt;“中;

                  qry.Webs = "<Webs Scope='Recursive'/>";
                  qry.ViewFields = "<FieldRef Name='Title'/><FieldRef
     

名称= '修改'/&gt;“中;

 //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()+“\”/&gt;“);

                              }

                          }

                          sb.Append("</Lists>");
                          qry.Lists = sb.ToString();

                          dt = web.GetSiteData(qry);

                      ..................

所以,我找到的唯一解决方案是在先前的代码之后通过Web进行循环,但我不认为这是一种非常优化的方式:

     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 个答案:

答案 0 :(得分:2)

最后我做了以下,我不知道最终有什么用,我改变了我对列表的看法,并且我已经包含了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 :(得分:1)

您谈到将网络范围设置为递归,但在您的(格式错误的)示例代码中,您将webs属性留空,这意味着网站数据查询将仅搜索指定的网络。

您的代码的这个特定(省略)细节非常重要,因为在innerXML规范中即使是最轻微的拼写错误也会默默地将行为恢复为默认值,这意味着只有当前的网络将会被搜查。一个典型的陷阱是在Web或Scope中使大写错误。

对于记录,正确的指定方法是

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

作为快速检查,您可以尝试将范围设置为SiteCollection,看看是否有效。

[编辑] 同意,现在您的网站属性显示似乎很好:-)。您是否尝试在Campo字段的fieldref中设置Nullable ='TRUE'属性?如果该字段在任何子网站中不存在(或已损坏或任何其他),则可能有所帮助。的 [/编辑]