我需要帮助将以下代码段转换为使用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;
答案 0 :(得分:3)
SPQuery和SPSiteDataQuery之间的主要区别在于指定要查询的列表。与SPQuery不同,在SPSiteDataQuery中,您无法指定列表标题来缩小每个站点中的查询范围,只有Lists元素的灵活性要低得多。 Vincent Rothwell描述了all of the possibilities here。
这种不灵活性意味着在Lists元素代码中使用BaseType = 1将返回所有文档库中的文档。您可以避免这种情况的唯一方法是为Quality Documents
部署自定义列表模板并使用自己的ID号。然后,您就可以使用<Lists ServerTemplate='XYZ' />
(其中XYZ是ID号,以将结果缩小到该类型的列表)。否则,您需要过滤返回的结果,因此它们只包含Quality Documents
库中的条目。
除此之外,您的代码看起来相同。如果您正在运行MOSS,您可能还希望查看CrossListQueryInfo和CrossListQueryCache。这些允许您缓存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有时会报告误报,并且可以忽略这些(请阅读文档以告诉您如何)。