是否获取在Sharepoint中具有值的字段的SPWeb和子Web的所有网页?

是否获取在Sharepoint中具有值的字段的SPWeb和子Web的所有网页?,sharepoint,sharepoint-2007,Sharepoint,Sharepoint 2007,我在Sharepoint 2007中有一个网站。我想做一个查询,其中网页的字段“home”在一个特定的SPWeb和(这是重要的部分)其子SPWeb中等于1。 我可以使这项工作与该网站的问题,而不是与子网站。也就是说:它不是递归的,但我在“webscope='recursive'”子句中指出了它 我还包括我想要使用的列表,也就是说,页面(不是文档、母版页或其他什么),这是我寻找“850”基本模板(页面的那个)的目的 我使用的代码是这样的(我已经尝试了使用相同查询的其他方法,结果是相同的): Get

我在Sharepoint 2007中有一个网站。我想做一个查询,其中网页的字段“home”在一个特定的SPWeb和(这是重要的部分)其子SPWeb中等于1。 我可以使这项工作与该网站的问题,而不是与子网站。也就是说:它不是递归的,但我在“webscope='recursive'”子句中指出了它

我还包括我想要使用的列表,也就是说,页面(不是文档、母版页或其他什么),这是我寻找“850”基本模板(页面的那个)的目的

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

GetSystemToken(当前站点))) {

                      using (SPWeb web = site.OpenWeb("/News/"))
                      {

                          StringBuilder sb = new StringBuilder();

                          sb.Append("<Lists>");

                          foreach (SPList list in web.Lists)
                          {

                              if (list.BaseTemplate.ToString() ==
                                  sb.Append("<List ID=\"" +
使用(SPWeb=site.OpenWeb(“/News/”)
{
StringBuilder sb=新的StringBuilder();
某人加上(“”);
foreach(web.Lists中的SPList列表)
{
if(list.BaseTemplate.ToString()==
“850”) {

                      using (SPWeb web = site.OpenWeb("/News/"))
                      {

                          StringBuilder sb = new StringBuilder();

                          sb.Append("<Lists>");

                          foreach (SPList list in web.Lists)
                          {

                              if (list.BaseTemplate.ToString() ==
                                  sb.Append("<List ID=\"" +
sb.追加(“”)

}
}
某人加上(“”);
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();
                              }
foreach(web.Webs中的spwebw2)
{
sb=新的StringBuilder();
某人加上(“”);
foreach(w2.Lists中的SPList列表)
{
if(list.BaseTemplate.ToString()
== "850")
{
某人加上(“”);
}
}
某人加上(“”);
qry.Lists=sb.ToString();
数据表dttmp=w2.GetSiteData(qry);
如果(dttmp!=null
&&dttmp.Rows.Count>0)
{
dt.Merge(dttmp);
}
w2.Dispose();
}

您谈到将web作用域设置为递归,但在(格式错误的)示例代码中,您将“web”属性保留为空,这意味着站点数据查询将仅搜索指定的web

代码的这一特定(省略)细节非常重要,因为在innerXML规范中犯下哪怕是最轻微的拼写错误都会使行为自动恢复到默认状态,这意味着只搜索当前web。一个典型的陷阱是web或范围中的大小写错误

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

qry.Webs = "<Webs Scope='Recursive' />";
qry.Webs=”“;
作为快速检查,您可以尝试将作用域设置为SiteCollection,看看是否有效


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

最后,我做了以下几点,我不知道最后是什么效果,我改变了询问列表的方式,并加入了RowLimit:

数据表dt=null; 数据视图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;
SPSiteDataQuery qry=new SPSiteDataQuery();
qry.Query=“1”;
qry.Query+=“”;
qry.Webs=“”;
qry.Lists=“”;
qry.RowLimit=3;
qry.ViewFields=“”;
使用(SPSite站点=新SPSite(CurrentSite.ID,GetSystemToken(CurrentSite)))
{
使用(SPWeb=site.OpenWeb(webUrl))
{   
dt=web.GetSiteData(qry);
dv=dt.DefaultView;
}
}
返回dv;

很抱歉,是编辑器隐藏了似乎格式不正确的部分。我也尝试了SiteCollection。谢谢你的帮助,我最后做了一些不同的事情,不要问我是什么让这项工作成功的。很高兴你启动并运行了这项工作!哦,谢谢你发布了工作代码。
                                  sb.Append("<List ID=\"" +
                              }

                          }

                          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();
                              }
qry.Webs = "<Webs Scope='Recursive' />";
    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;