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

SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 3)的更多相关文章

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

    SharePoint服务器端对象模型 之 使用CAML进行数据查询 一.概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列 ...

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

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

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

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

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

    (五)列表查询中的阈值限制 在之前版本的SharePoint 中,如果在查询的时候没有指定返回数目,那么SharePoint将会查找该列表中所有的条目,这可能会造成在SQL表中需要返回大量的条目,极大 ...

  5. SharePoint 服务器端对象模型 之 使用LINQ进行数据访问操作(Part 2)

    (四)使用LINQ进行列表查询 在生成实体类之后,就可以利用LINQ的强大查询能力进行SharePoint列表数据的查询了.在传统SharePoint对象模型编程中,需要首先获取网站对象,再进行其他操 ...

  6. SharePoint服务器端对象模型 之 使用LINQ进行数据访问操作(Part 4)

    (六)高效合理的使用LINQ 1.DataContext中的两个属性 为了能够使用DataContext进行数据提交,在DataContext进行数据查询和操作的过程中,内部会进行数据状态的保持和追踪 ...

  7. SharePoint服务器端对象模型 完结

    整个系列已完结,大概看了一眼,平均阅读量不到200.估计也没什么人看了,而且服务器端对象模型除了在某些企业开发中会用到,从2013时代开始其实已经不是SharePoint开发的最佳选择了.不过既然已经 ...

  8. 开启貌似已经过时很久的新坑:SharePoint服务器端对象模型

    5年前(嗯,是5年前),SharePoint 2010刚发布的时候,曾经和kaneboy试图一起写一本关于SharePoint 2010开发的书,名字叫<SharePoint 2010 应用开发 ...

  9. SharePoint服务器端对象模型 之 序言

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

随机推荐

  1. 工作流学习——Activiti流程变量五步曲

    一.前言 上一篇文章我们将流程实例的启动与查询,任务的办理查询都进行了介绍,我们这篇文章来介绍activiti中的流程变量. 二.正文 流程变量与我们寻常理解的变量是一样的,仅仅只是是用在了我们act ...

  2. 【Java】Java_07 浮点型

    浮点型 类型 占用存储空间 表数范围 Float 4字节 -3.403E38~3.403E38 Double 8字节 -1.798E308~1.798E308 float类型又被称作单精度类型,尾数可 ...

  3. JavaScript | 基础(变量/引用/转换/函数)

    ———————————————————————————————————————————— 变量 全局变量:在函数体外声明,全局可以使用 局部变量:通过关键字var来声明 变量类型 <script ...

  4. 用jQuery和PHP来实现转盘抽奖程序

    准备工作 首先要准备素材,抽奖的界面用到两张图片,圆盘图片和指针图片,实际应用中可以根据不同的需求制作不同的圆盘图片. 接着制作html页面,实例中我们在body中加入如下代码: <div cl ...

  5. jq时间戳转化为可视化时间

    //2016年5月21日 23:12:07 function getDateTimeToDate(dt){ var dateTime = new Date(dt); var date = dateTi ...

  6. Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理

    Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理 1. 重载包括:普通方法的重载和构造方法的重载 1 1.1. 横向重载”和“纵向重载”1 1.2. 方法签名通过  方法名称,参数 ...

  7. 基于AFNetworking封装的网络请求工具类【原创】

    今天给大家共享一个我自己封装的网络请求类,希望能帮助到大家. 前提,导入AFNetworking框架, 关于修改AFN源码:通常序列化时做对text/plan等的支持时,可以一劳永逸的修改源代码,在a ...

  8. 转:C++ 关键字 inline详细介绍

    1.  内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: int max(int a, int b) { return a > b ? a : b; } 为这么一个小的操作定义一个 ...

  9. linux用户密码生成

    linux账户保存在/etc/passwd,密码保存在/etc/shadow. 通过man 5 passwd,man 5 shadow可查看文件中各字段含义. encrypted password   ...

  10. How tomcat works学习笔记

    最近在看Tomcat的源码, 所以找了一本相关的书籍<How tomcat works>. 博客内容多为 学习该书时所记录的笔记.(如有侵权行为,请联系我:eviltomorrow@163 ...