(四)使用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变量的结果。

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

  1. 【转】4.SharePoint服务器端对象模型 之 使用CAML进行数据查询

    (一)概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列表条目的集合. 除去列表上的查询之外,在SharePoint中还大 ...

  2. SharePoint服务器端对象模型 之 使用CAML进行数据查询

    (一)概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列表条目的集合. 除去列表上的查询之外,在SharePoint中还大 ...

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

    (三)使用SPQuery进行列表查询 1.概述 列表查询主要是指在一个指定的列表(或文档库)中按照某些筛选.排序条件进行查询.列表查询主要使用SPQuery对象,以及SPList的GetItems方法 ...

  4. 【转】2.3SharePoint服务器端对象模型 之 访问网站和列表数据(Part 3)

    (三)视图 与传统意义上的数据视图类似,SharePoint中的列表视图指定了列表中数据的筛选条件.排序条件.分组条件.显示栏/字段.显示条目数.显示样式等内容.在SharePoint中,使用SPVi ...

  5. 【转】3.3SharePoint服务器端对象模型 之 访问文件和文件夹(Part 3)

    (三)遍历 文件系统的遍历是指按照文件夹的层级结构遍历文档库.列表的文件夹和列表条目.遍历主要有三种方式:(1)直接使用文件系统对象模型进行遍历:(2)使用SPDocumentLibrary进行遍历: ...

  6. Sharepoint学习笔记 –架构系列—09 Sharepoint的服务器端对象模型(Server Object Model) 1.物理对象层次结构

    关于Sharepoint的服务器端对象模型的内容很庞大很繁杂,而事实上,我们在这里只把最关键的对象梳理一下,我们会从三个体系来大致描述它们. 这三个体系分别是: 1.物理对象层次结构(Physical ...

  7. 【转】1.2SharePoint服务器端对象模型 之 对象模型概述(Part 2)

    (三)Url 作为一个B/S体系,在SharePoint的属性.方法参数和返回值中,大量的涉及到了Url,总的来说,涉及到的Url可以分为如下四类: 绝对路径:完整的Url,包含了协议头(http或h ...

  8. 【转】0.SharePoint服务器端对象模型 之 序言

    对于刚刚开始接触SharePoint的开发人员,即使之前有较为丰富的ASP.NET开发经验,在面对SharePoint时候可能也很难找到入手的方向.对于任何一种开发平台而言,学习开发的过程大致会包括: ...

  9. 千牛包表包下载_带有服务器端处理和VueJS组件的数据表包

    千牛包表包下载 Vue数据表 (Vue Data Table) Data Table package with server-side processing and VueJS components. ...

最新文章

  1. [JSOI2008]星球大战 并查集
  2. 23种设计模式C++源码与UML实现--备忘录模式
  3. 搞懂 SQL 查询优化原理分析,秒速处理大数据量查询
  4. python里的join方法_python中join()方法介绍
  5. tomee_使用Vysper,TomEE和PrimeFaces将XMPP服务器嵌入JSF Web应用程序内部
  6. 源码分析Dubbo服务消费端启动流程
  7. 十荟团关停全国业务 社区电商开启“降本增效”大突围
  8. IMU-Allan方差分析
  9. python画圣诞树_python画圣诞树
  10. Java 集合系列18之 Iterator和Enumeration比较
  11. GMSK信号调制公式与matlab代码
  12. 2021年山东省安全员C证报名考试及山东省安全员C证操作证考试
  13. xp给指定计算机共享,WinXP系统设置访问共享提示指定网络名不可用怎么解决
  14. matlab 齐次线性方程组,利用matlab求解RE中出现的齐次线性方程组
  15. vmbox 导入虚拟电脑之后无法上网
  16. java实现屏幕自动截屏_使用Java实现静默屏幕截图
  17. 服务器间通过ssh使用密钥对实现无密码登录
  18. Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page
  19. 欧拉角、万向节死锁理解
  20. 北京自考中心平台登陆方法信息整理

热门文章

  1. LR通过SiteScope监控mysql
  2. python学习---语法
  3. 易宝支付碰到 交易签名无效问题 (2)
  4. 流量专家为114搜索提供权威流量访问统计
  5. 扩展欧几里得算法 POJ 1061
  6. 【解决问题】idea启动本地tomcat访问localhost:8080报404错误
  7. python对象属性在引用时前面需要加()_python基础-面向对象进阶
  8. c语言中x的n次方怎么表示_线性代数的本质及其在人工智能中的应用
  9. 常州win8如何禁用应用商店_Win8系统当中Windows defnedder安全软件应该如何禁用?...
  10. 微信小程序php实现登陆的代码,微信小程序实现微信登录