需要将单个文档库上的SPQuery转换为站点中所有文档库上的SPSiteDataQuery

时间:2009-07-14 15:51:24

标签: sharepoint spsitedataquery

我需要帮助将以下代码段转换为使用SPSiteDataQuery而不是SPQuery b / c我需要在站点中的所有文档库中进行查询。

这是原始代码:

using (SPWeb oWeb = new SPSite(properties.SiteId).OpenWeb(properties.RelativeWebUrl))
                {
                    SPList oList = oWeb.Lists["Quality Documents"];

                    //create query
                    SPQuery oQuery = new SPQuery();

                    //configure the query  //
                    oQuery.Query = "<Where><Eq><FieldRef Name='Document_x0020_Number' /><Value Type='Text'>" + docNum + "</Value></Eq></Where>";

                    //get the collection of items in the list
                    SPListItemCollection oItems = oList.GetItems(oQuery);

                    if (oItems.Count > 0)
                    {
                        newRnd = 0;
                    }
                    else
                    {
                        newRnd = 1;
                    }
                }

这就是我对SPSiteDataQuery的看法,但我不知道它是否正确和/或如何确保代码与上述代码完全相同。

SPSiteDataQuery q = new SPSiteDataQuery();
q.Lists = "<Lists BaseType='1'/>";
q.Query = "<Where><Eq><FieldRef Name='Document_x0020_Number' /><Value Type='Text'>" + docNum + "</Value></Eq></Where>";
q.Webs = "<Webs Scope='SiteCollection' />";
q.ViewFields = "<FieldRef Name='Document_x0020_Number' />"';
q.RowLimit = 1;

1 个答案:

答案 0 :(得分:3)

SPQuerySPSiteDataQuery之间的主要区别在于指定要查询的列表。与SPQuery不同,在SPSiteDataQuery中,您无法指定列表标题来缩小每个站点中的查询范围,只有Lists元素的灵活性要低得多。 Vincent Rothwell描述了all of the possibilities here

这种不灵活性意味着在Lists元素代码中使用BaseType = 1将返回所有文档库中的文档。您可以避免这种情况的唯一方法是为Quality Documents部署自定义列表模板并使用自己的ID号。然后,您就可以使用<Lists ServerTemplate='XYZ' />(其中XYZ是ID号,以将结果缩小到该类型的列表)。否则,您需要过滤返回的结果,因此它们只包含Quality Documents库中的条目。

除此之外,您的代码看起来相同。如果您正在运行MOSS,您可能还希望查看CrossListQueryInfoCrossListQueryCache。这些允许您缓存SPSiteDataQuery样式的查询。有关此问题的详细信息,请参阅this post by Jeff Dalton

从对象处理的评论中更新:

您的代码将泄漏SPSite对象 - 这也需要一个using子句。用这些行替换当前使用的行:

using (SPSite oSite = new SPSite(properties.SiteId))
using (SPWeb oWeb = oSite.OpenWeb(properties.RelativeWebUrl))
{
    // Your code
}

此外,很容易使用SPDisposeCheck。要与Visual Studio集成,请将以下行添加到项目的构建后事件中:

  

“%PROGRAMFILES%\微软\的SharePoint   配置Check \ SPDisposeCheck.exe“   $(TARGETPATH)

如果内存泄漏,构建现在将失败。检查“输出”窗口以获取它们的详细信息。请注意,SPDisposeCheck有时会报告误报,并且可以忽略这些(请阅读文档以告诉您如何)。