【转】4.3SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 3)

(四)使用SPSiteDataQuery进行多列表查询

1、概述

前面介绍的列表查询有很多优势,但是它的一个缺点就是一次只能在一个列表中进行查询,在SharePoint中,提供了一个跨网站、跨列表查询的机制。通过使用SPSiteDataQuery对象,以及SPWeb的GetSiteData方法,将SPSiteDataQuery作为参数,可以进行跨网站和跨列表的查询。

它与列表查询的相同之处在于:

(1) 使用同样的Query属性确定筛选条件和排序条件(不支持分组条件);

(2) 使用同样的ViewFields属性确定返回字段;

(3) 使用同样的RowLimit属性确定一次返回的条目数。

它与列表查询的不同之处在于:

(1) 可以跨网站跨列表查询(但是有一定的限制,见后文);

(2) 返回的类型是DataTable,而非SPListItemCollection;

(3) 不支持像列表查询那样的分页功能;

(4) 不再有ViewAttributes和Folder指定精细的查询范围;

(5) ViewFields属性返回字段的设置略有差别。

 

2、同时在多个列表中进行数据查询

通过使用SPSiteDataQuery的Lists属性指定跨列表的范围。

Lists是一个string类型的属性,同样需要使用CAML的格式来定义列表的范围,定义的方法包括如下内容:

(1) 指定列表模板,查询指定列表模板的所有列表,指定方式形如:“<Lists ServerTemplate='TemplateID' />”。其中的TemplateID为列表模板的整型ID,SharePoint内置列表模板的ID可以在SPListTemplateType枚举中查到,例如通知列表模板的ID是104.

(2) 指定列表基类型,查询指定基类型的所有列表,指定方式形如:“<Lists BaseType='BaseTypeID' />”。其中的BaseTypeID是列表基类型的ID,可以通过SPBaseType枚举查到,例如文档库类型的ID为1。

(3) 指定是否查找隐藏列表,默认情况下,跨列表查询时忽略隐藏列表的(比如网站模板库、母版页库等等),可以通过在Lists属性中指定Hidden属性来查找隐藏列表,形如:“<Lists Hidden='TRUE'/>”。

(4)指定查找某些特定的列表,通过列表的Guid可以在某几个特定的列表中进行查找,形如:

   1: <Lists>
   2:   <List ID="7A9FDBE6-0841-430a-8D9A-53355801B5D5" />
   3:   <List ID="3D18F506-FCA1-451e-B645-2D720DC84FD8" />
   4: </Lists>

(5)指定查找包含某个索引字段的列表,形如:

   1: <Lists>
   2:   <WithIndex FieldId="D4819257-6B69-41F1-82C8-A91615BFF500" 
   3: Type="Text" Value="Complete" />
   4: </Lists>

如果默认不指定Lists属性,则其默认值为“<Lists BaseType='0' />”,即相当于查找所有的GenericList(普通列表),并且不包括隐藏列表在内。

需要特别声明的是,尽管提供了上述多种跨列表的方式,但是无论使用哪一种方式,跨列表查询均无法跨越不同的BaseType进行查找。举个例子说,SharePoint无法在跨列表查询的时候,同时查找一个普通列表和一个文档库中的内容,因为它们的BaseType不同。也就是说,如果希望能够查到一个网站中的所有列表,那么就只能进行多次查找,并将找到的DataTable结果拼合在一起。

 

3、同时在多个网站中进行数据查询

通过使用SPSiteDataQuery的Webs属性进行跨网站查找。

跨网站查找有三种方式:

(1) 默认不指定Webs属性,即查找当前网站;

(2) 使用“<Webs Scope='Recursive'/>”查找当前网站及其所有后代网站;

(3)使用“<Webs Scope='SiteCollection'/>”查找整个网站集。

 

4、返回字段(栏)

在列表查询中,如果不指定ViewFields这个属性,那么在返回查找结果的时候,是返回列表中的所有字段;而在跨网站跨列表查询中,如果不指定这个属性,则在结果的DataTable中只会返回三个字段:网站ID、列表ID、列表条目ID——通过这个三个ID,就可以唯一确定一个列表条目在网站中的位置。而且这三个字段是无法去掉的。

自然,SPSiteDataQuery也可以和SPQuery一样,通过指定ViewFields属性,返回需要的字段值,不过有两个地方与列表查询有所区别:

(1) SPSiteDataQuery在指定ViewFields的时候,可以通过ListProperty标签返回列表的属性(基本上就是列表的标题),以及通过ProjectProperty标签返回网站的属性(基本上就是网站的标题)。

(2) 因为不同列表可能会存在着结构上的不同,因此在SPSiteDataQuery的ViewFields属性的FieldRef标签中,设置了Nullable属性,放置某个列表字段的缺失。举例来说,如果一个列表1中包含了字段A、B,而列表2中包含了字段A、C,用户希望能够在返回结果的时候返回字段A和B。如果按照原有的方式编写ViewFields属性,那么在列表2中的所有条目都无法被查询到,因为列表2没有需要显示的B字段,为了避免这一情况的发生,可以将属性指定为:“<FieldRef Name='A'/><FieldRef Name='B' Nullable='TRUE' />”。

下面是一个跨网站跨列表查询的例子,例子中查询的是网站集中所有文档库中名字包含“sp”的文档和文件夹:

   1: using(SPSite site = new SPSite("http://sp2010/book"))
   2: {
   3:   using(SPWeb web = site.OpenWeb())
   4:   {
   5:     SPSiteDataQuery query = new SPSiteDataQuery();
   6:     query.Query = "<Where><Contains><FieldRef Name='FileLeafRef'/>"
   7:  + "<Value Type='Text'>sp</Value></Contains></Where>";
   8:     query.ViewFields = "<FieldRef Name='FileLeafRef'/>" +
   9:         "<ListProperty Name='Title'/>" +
  10:               "<ProjectProperty Name='Title'/>";
  11:     query.Lists = "<Lists BaseType='1' />";
  12:     query.Webs = "<Webs Scope='SiteCollection' />";
  13:  
  14:     DataTable result = web.GetSiteData(query);
  15:     Console.WriteLine(result.Rows.Count);
  16:   }
  17: }

上面的程序中出于篇幅考虑没有输出DataTable的具体内容,可以使用Visual Studio的调试工具,在输出一行上加入断点,使用调试工具中的DataTable查看器来查看result变量的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode1046】最后一块石头的重量(堆heap)

题干&#xff1a; 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出两块 最重的 石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a; 如果 x y&#xff0c;那么…

一步步编写操作系统 49 加载内核2

内核文件kernel.bin是elf格式的二进制可执行文件&#xff0c;初始化内核就是根据elf规范将内核文件中的段&#xff08;segment&#xff09;展开到&#xff08;复制到&#xff09;内存中的相应位置。在分页模式下&#xff0c;程序是靠虚拟地址来运行的&#xff0c;无论是内核还是…

【牛客 - NC93】设计LRU缓存结构(模拟)

设计LRU缓存结构_牛客题霸_牛客网 描述 设计LRU(最近最少使用)缓存结构&#xff0c;该结构在构造时确定大小&#xff0c;假设大小为 k &#xff0c;并有如下两个功能 1. set(key, value)&#xff1a;将记录(key, value)插入该结构 2. get(key)&#xff1a;返回key对应的val…

【转】理解SQL Server的安全对象和权限

理解安全对象(Securable) 安全对象&#xff0c;是SQL Server 数据库引擎授权系统控制对其进行访问的资源。通俗点说&#xff0c;就是在SQL Server权限体系下控制的对象&#xff0c;因为所有的对象(从服务器&#xff0c;到表&#xff0c;到视图触发器等)都在SQL Server的权限体系…

【LeetCode 986】 区间列表的交集(区间交集)

给定两个由一些 闭区间 组成的列表&#xff0c;firstList 和 secondList &#xff0c;其中 firstList[i] [starti, endi] 而 secondList[j] [startj, endj] 。每个区间列表都是成对 不相交 的&#xff0c;并且 已经排序 。 返回这 两个区间列表的交集 。 形式上&#xff0c…

【转】SQL Server服务器名称与默认实例名不一致的修复方法

服务器级的urn筛选器无效&#xff1a;筛选器必须为空&#xff0c;或服务器属性必须等于实际的服务器名称 这个问题是出在本地连接还是远程连接上&#xff0c;这个问题可能是由于修改过服务器名称导致的。你可以尝试在本地的服务器和SQL Server上运行以下指令&#xff0c;看看服…

【LeetCode 295】. 数据流的中位数

中位数是有序列表中间的数。如果列表长度是偶数&#xff0c;中位数则是中间两个数的平均值。 例如&#xff0c; [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 3) / 2 2.5 设计一个支持以下两种操作的数据结构&#xff1a; void addNum(int num) - 从数据流中添加一个整数到…

【转】如何从SharePoint Content DB中查询List数据***

SharePoint用来维护基础数据非常方便&#xff0c;只需要建立自定义列表&#xff0c;然后使用InfoPath自定义一下维护界面&#xff0c;就可以实现在线的增删改查&#xff0c;开发效率很高。如果维护的数据需要进行审批&#xff0c;还可以加入工作流功能。使用SharePoint Designe…

【搬石头排序】

据说是2020浪潮笔试 时间限制&#xff1a;C / C 语言 1000 MS&#xff1b;其他语言 3000 MS 内存限制&#xff1a;C / C 语言 131072 KB&#xff1b;其他语言 655360 KB 题目描述&#xff1a; 沙滩按照线型摆放着n个大小不一的球形石头&#xff0c;已知第i个石头的半径为ri&a…

【转】SharePoint Content Database简介

SharePoint作为微软主打的企业Portal平台&#xff0c;功能强大&#xff0c;使用简单&#xff0c;非常的方便。对于很多关系数据&#xff0c;我们可以使用自定义列表来维护&#xff0c;如果是非关系数据&#xff0c;可以使用文档库来维护。另外还可以在上面进行版本维护&#xf…

【LeetCode 2】两数相加(链表)

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

软件测试几个概念 --dev sit uat

DEV环境&#xff1a;DEV顾名思义就是develop&#xff0c;即代码开发的环境。 SIT环境&#xff1a;System Integration Test系统集成测试&#xff0c;开发人员自己测试流程是否走通。 UAT环境&#xff1a;User Acceptance Test用户验收测试&#xff0c;由专门的测试人员验证&…

【LeetCode 629】K个逆序对数组

给出两个整数 n 和 k&#xff0c;找出所有包含从 1 到 n 的数字&#xff0c;且恰好拥有 k 个逆序对的不同的数组的个数。 逆序对的定义如下&#xff1a;对于数组的第i个和第 j个元素&#xff0c;如果满i < j且 a[i] > a[j]&#xff0c;则其为一个逆序对&#xff1b;否则…

VSTS TFS 强制删除签出锁定项 解除 锁定

项目组一哥们走的时候以独占方式迁出了文件&#xff0c;现在其他人都无法修改&#xff0c;管理员似乎也无法将文件解除。经过摸索&#xff0c;找到了一种暴力的方法——直接改数据库。虽然暴力&#xff0c;却能实实在在地解决这个问题。 步骤&#xff1a; 1、连接到TFS数据库…

【NC30】缺失的第一个正整数

描述 给定一个无重复元素的整数数组nums&#xff0c;请你找出其中没有出现的最小的正整数 进阶&#xff1a; 空间复杂度 O(1)&#xff0c;时间复杂度 O(n) 数据范围: -2^31<nums[i]<2^31-1 0<len(nums)<5*10^5 示例1 输入&#xff1a; [1,0,2] 复制返回值…

【NC140 排序】手写快速排序

描述 给定一个长度为 n 的数组&#xff0c;请你编写一个函数&#xff0c;返回该数组按升序排序后的结果。 数据范围&#xff1a; 0 \le n \le 1\times10^30≤n≤1103&#xff0c;数组中每个元素都满足 0 \le val \le 10^90≤val≤109 要求&#xff1a;时间复杂度 O(n^2)O(n2)…

【LCS系列】最长公共子序列和最长公共子串

最长公共子序列&#xff1a; 如果要回溯出整个字符串的答案的话&#xff0c;可以直接看dp[i][len2-1]列&#xff0c;或者dp[len1-1][i]这一行&#xff0c;变化的时候&#xff0c;则代表要选这个字符&#xff0c;然后连起来就可以了。&#xff08;即构造字符串的过程是On的&…

sharepoint文档库文档版本信息操作

SPListItem spDoc oWeb.Lists["共享文档"].GetItemById(DocumentID); SPFileVersionCollection versionColl spDoc.File.Versions; foreach (SPFileVersion version in versionColl) {     //将UTC时间格式转换为本地时间 DateTime versionTime Conv…

【NC14 按之字形顺序打印二叉树】

描述 给定一个二叉树&#xff0c;返回该二叉树的之字形层序遍历&#xff0c;&#xff08;第一层从左向右&#xff0c;下一层从右向左&#xff0c;一直这样交替&#xff09; 数据范围&#xff1a;0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| < 100∣val∣<1…

【NC51 合并k个已排序的链表】K路归并

描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 数据范围&#xff1a;节点总数 0 \le n \le 50000≤n≤5000&#xff0c;每个节点的val满足 |val| < 1000∣val∣<1000 要求&#xff1a;时间复杂度 O(nlogn)O(nlogn) 示例1 输入&#xff1a; [{1…