1

我有一个 webpart,它是顶级站点下的 2-3 个子站点。我需要查询顶级站点集合中的列表和同一级别的列表,我想它可能通过 SPSiteDataquery...我对此有一些困惑我可以编写一个可以查询这两个列表的查询...。

此查询的范围是 sitecollection,这意味着它将查看 sitecollection 中的所有列表。如果我的 CAML 查询对于这两个列表都相同……它应该可以工作吗?

让我通过我的代码解释一下:

SPSite mySite = SPControl.GetContextSite(Context);
                SPWeb myWeb = SPControl.GetContextWeb(Context);
                SPSiteDataQuery qry = new SPSiteDataQuery();
                qry.Lists = "<Lists BaseType='0' />";

                qry.Query = "<Where><Contains><FieldRef Name='Country'/><Value Type='Text'>" + strcount + "</Value></Contains></Where>";

                qry.ViewFields = "<FieldRef Name='Capital' Nullable='TRUE'/><FieldRef Name='Currency' Nullable='TRUE'/>";

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

                DataTable dt = myWeb.GetSiteData(qry);

现在我需要顶级站点列表中的货币和同一级别列表中的资本。这可能吗?还是我误解了 SPSiteDataQuery ...?

4

1 回答 1

2

您走在正确的轨道上,并且可以检索不同网站中列表的结果。以下示例显示如何从默认的“任务”或“工作流任务”列表中检索项目,并使用在根级别和子站点内创建的任务列表。

        SPSiteDataQuery q = new SPSiteDataQuery();
        q.ViewFields = "<FieldRef Name='Title'/><FieldRef Name='Priority'/><FieldRef Name='Status'/>";
        q.Webs = "<Webs Scope='SiteCollection' />";
        q.Lists = "<Lists BaseType='0' />";
        q.Query = "<Where><Gt><FieldRef Name='ID' /><Value Type='Number'>0</Value></Gt></Where>";

        DataTable results = new DataTable();

        using (SPSite site = new SPSite("http://sharepoint"))
        {
            using (SPWeb web = site.OpenWeb("subsite"))
            {                    
                results = web.GetSiteData(q);
            }
        }

我使用硬编码的 URL 编写了它,因此您可以在控制台应用程序中运行它以进行测试,但您可以将 using 语句替换为SPWeb web = SPContext.Current.Web;将其放入 Web 部件中的内容。

其他一些值得考虑的事情:

  • 您要查询的列表必须包含ViewFields 元素中的所有字段
  • 多查找字段不适用于 SPSiteDataQuery(单值查找字段可以)
  • u2u CAML 构建器工具对于测试 CAML 查询也很有用。见http://www.u2u.be/Res/Tools/CamlQueryBuilder.aspx
于 2010-02-04T19:19:17.060 回答