我在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();
}
答案 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'属性?如果该字段在任何子网站中不存在(或已损坏或任何其他),则可能有所帮助。的 [/编辑] 强>