需要将单个文档库上的spquery转换为网站上所有文档库上的spsitedataquery

StackOverflow https://stackoverflow.com/questions/1126337

  •  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;
有帮助吗?

解决方案

主要区别 Spqueryspsitedataquery 在指定查询列表中。与Spquery不同,在SPSITEDAQUERY中,您无法指定列表标题来缩小每个站点中查询的范围,您只有列表元素的灵活性要少得多。文森特·罗斯威尔(Vincent Rothwell)描述 这里的所有可能性.

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

除此之外,您的代码看起来等同于。您可能也想看 CrossListQueryInfoCrossListQueryCache 如果您正在运行苔藓。这些允许您缓存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有时会报告误报,并且可以忽略这些阳性(阅读文档以告诉您如何)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top