1

我需要帮助转换以下代码片段以使用 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;
4

1 回答 1

3

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

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

除此之外,您的代码看起来等效。如果您正在运行 MOSS ,您可能还想查看CrossListQueryInfoCrossListQueryCache 。这些允许您缓存 SPSiteDataQuery 样式的查询。有关这方面的详细信息,请参阅Jeff Dalton的这篇文章。

关于对象处置的评论更新:

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

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

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

"%ProgramFiles%\Microsoft\SharePoint Dispose Check\SPDisposeCheck.exe" $(TargetPath)

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

于 2009-07-14T16:56:17.877 回答