需要将单个文档库上的spquery转换为网站上所有文档库上的spsitedataquery
-
13-09-2019 - |
题
我需要帮助将以下代码段转换为使用SPSITEDAQUERY而不是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;
解决方案
主要区别 Spquery 和 spsitedataquery 在指定查询列表中。与Spquery不同,在SPSITEDAQUERY中,您无法指定列表标题来缩小每个站点中查询的范围,您只有列表元素的灵活性要少得多。文森特·罗斯威尔(Vincent Rothwell)描述 这里的所有可能性.
这种僵化性意味着在列表中使用basetype = 1的元素代码将返回所有文档库中的文档。您避免这种情况的唯一方法是,如果您部署了一个自定义列表模板 Quality Documents
具有自己的ID号。然后您可以使用 <Lists ServerTemplate='XYZ' />
(其中XYZ是将结果缩小到该类型列表的ID号)。否则,您将需要过滤结果,因此它们仅包含来自 Quality Documents
图书馆。
除此之外,您的代码看起来等同于。您可能也想看 CrossListQueryInfo 和 CrossListQueryCache 如果您正在运行苔藓。这些允许您缓存SPSITEDAQUERY风格的查询。看 杰夫·道尔顿(Jeff Dalton)的这篇文章 有关此的良好信息。
从有关物体处置的评论中更新:
您的代码将泄漏Spsite对象 - 这也需要使用子句。替换您当前使用这些行的使用行:
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有时会报告误报,并且可以忽略这些阳性(阅读文档以告诉您如何)。