SharePoint服务器端对象模型 之 使用CAML进展数据查询
SharePoint服务器端对象模型 之 使用CAML进行数据查询
一、概述
在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选、排序条件,获得某个列表或者某一些列表中相应的列表条目的集合。
除去列表上的查询之外,在SharePoint中还大量存在着各种各样的查询,比如针对回收站的SPRecycleBinQuery、针对审计的SPAuditQuery、针对变更的SPChangeQuery等等,不过这些查询在实际项目中使用到的频率并不是很高。本章节还是着重介绍列表查询功能。
在SharePoint 2010之前,列表查询的查询语句都是通过CAML这样一种XML格式来编写的。对于开发人员来讲,准确快速地编写出较为复杂的CAML查询并非是一件轻而易举的事情,但是使用CAML进行数据查询仍是SharePoint开发中不可或缺的技能。本节将介绍如何使用CAML进行列表查询和跨多个列表之间的查询,在下一节中将介绍SharePoint 2010新引入的列表查询方式——LINQ。
二、CAML查询字符串
在列表查询中,所有的查询条件都要使用一种Xml形式的语法进行描述,这种Xml语法被称作CAML(Collaborative Application Markup Language),是SharePoint中一种特定的Xml语法。实际上,在SharePoint中不仅是列表查询使用了CAML,在网站、列表、字段、内容类型、网站功能等各种对象的定义中,也大量使用了CAML格式的Xml。
CAML查询字符串总的来说可以分为3大部分:筛选条件、排序和分组条件、返回字段。
在编写CAML字符串的时候,需要特别注意Xml标签的大小写是敏感的。
1、筛选条件
使用CAML格式的筛选条件可以理解为是将传统的数据库中的SELECT语句以Xml的形式进行标准化,便于计算机的解析和阅读。
CAML格式的筛选条件使用<Where></Where>作为最外层结点,标志筛选条件的范围。筛选条件可以由若干个子筛选条件组成,每个子筛选条件的格式都类似于:
<操作符><字段/><值/></操作符> 相当于: [字段] [操作符] [值]
其中操作符部分一般应用中包括:Eq(等于)、Neq(不等于)、Lt(小于)、Leq(小于等于)、Gt(大于)、Geq(大于等于)、Contains(包含)、BeginsWith(以某字符串开头)、In(在集合范围内)、IsNull(为空)、IsNotNull(不为空)、Membership(属于用户组)。最后三个操作符是一元操作符,没有其中的“值”的部分。
字段部分的格式为:<FieldRef Name="字段名" 其他属性 />,特别注意不要遗忘最后的“/”终结符,字段名必须使用内部名称。
值部分的格式为:<Value Type="类型">值</Value>,其中类型部分根据不同的字段有不同的设置,常用的包括Text(文本)、Number(数值)、DateTime(日期)、Lookup(查阅项)等等。
例如,我们要在列表中查询“标题”字段(内部名称为Title)包含字符串“对象模型”的那些列表条目,如果是传统的T-SQL语句写法,应该是形如:
- SELECT * FROM xxList WHERE 标题 Contains '对象模型'
但是在SharePoint中,使用CAML格式描述后,就变成了:
- <Where>
- <Contains>
- <FieldRef Name='Title' />
- <Value Type='Text'>对象模型</Value>
- </Contains>
- </Where>
从查询条件的格式中可以看出,SharePoint在进行列表查询的时候,只支持字段与值的比较,而不支持两个字段之间的比较,这是一个较大的限制。
2、一些特殊的筛选条件
这里列出一些比较特殊的筛选条件的写法(均省略其中的Where标签):
(1)包含在集合范围内的查询,这是SharePoint 2010新增加的一种查询类型,使用“In”操作符来查询包含在指定范围内的集合。例如下面的例子查找了Writer包含在[“Erucy”, “Windie”]集合的章节(即Writer等于Erucy或Windie的章节):
- <In>
- <FieldRef Name='Writer'/>
- <Values>
- <Value Type='Text'>Erucy</Value>
- <Value Type='Text'>Windie</Value>
- </Values>
- </In>
(2)“是/否”类型的查询,该类型在数据库中实际上是bool类型,在查询的时候使用“1”表示“是”,使用“0”表示“否”,例如:
- <Eq>
- <FieldRef Name='BoolField'/>
- <Value Type='Boolean'></Value>
- </Eq>
(3)某个人员和组类型的字段等于当前用户,如果是多选的话其中包含当前用户:
- <Eq>
- <FieldRef Name='UserField'/>
- <Value Type='Integer'><UserID/></Value>
- </Eq>
(4)如果某个“用户或用户组”类型的字段填写的是用户组,筛选用户组包含当前用户的:
- <Membership Type='CurrentUserGroups'>
- <FieldRef Name='UserField'/>
- </Membership>
(5)默认情况下,对于时间和日期类型的查询只精确到日期,如果需要精确到时间:
- <Gt>
- <FieldRef Name='DateTimeField' />
- <Value Type='DateTime' IncludeTimeValue='TRUE'>
- --08T17::37Z
- </Value>
- </Gt>
(其中的日期格式可以通过使用一个静态方法SPUtility.CreateISO8601DateTimeFromSystemDateTime转换得到)
(6)一般情况下,进行查阅项或用户筛选的时候,可以使用Text类型的Value,判断查阅的列表条目的文本或用户的现实名称的字符串;如果需要精确按照被查阅条目的ID或用户的ID进行查找的话(对于多选查阅项和多选用户也应使用Eq操作符,而不是Contains操作符):
- <Eq>
- <FieldRef Name='LookupField' LookupId='TRUE'/>
- <Value Type='Lookup'></Value>
- </Eq>
(7)在日历模板类型的列表中,当需要查询某个指定时间范围内的事件的时候,如果是通过Gt/Geq和Lt/Leq方式查找,仅能查找到非重复事件,以及重复事件的第一次事件,为了能够准确地查找某个范围内的重复事件,需要使用DateRangesOverlap查询操作符,并配合SPQuery的一些属性进行。(在跨列表查询中不支持重复事件)
- <DateRangesOverlap>
- <FieldRef Name='EventDate' />
- <FieldRef Name='EndDate' />
- <FieldRef Name='RecurrenceID' />
- <Value Type='DateTime'>
- <Today />
- </Value>
- </DateRangesOverlap>
DateRangesOverlap操作符的写法相对比较固定,其中的EventDate是“开始时间”的内部名称;EndDate是“结束时间”的内部名称;RecurrenceID是某个和重复事件相关字段的内部名称。Value中的标签定义了查询的范围,包含如下4种:<Today/>(天)、<Week/>(周)、<Month/>(月)、<Year/>(年)。
查询的时候需要配合使用SPQuery的两个属性:ExpandRecurrence(bool类型)需要设置为true,表示查询的时候展开重复事件(即使没有重复事件,在使用操作符DateRangesOverlap的时候也应当设置此属性);CalendarDate(DateTime类型),设置查询范围的日期。例如,下面的程序查询了明天的所有事件(我们可以先提前了解一下SPQuery的使用):
- using(SPSite site = new SPSite("http://sp2010/book"))
- {
- using(SPWeb web = site.OpenWeb())
- {
- SPList calList = web.Lists["日历"];
- SPQuery query = new SPQuery();
- query.ExpandRecurrence = true;
- query.CalendarDate = DateTime.Today.AddDays();
- query.Query = "<DateRangesOverlap>" +
- "<FieldRef Name='EventDate' />" +
- "<FieldRef Name='EndDate' />" +
- "<FieldRef Name='RecurrenceID' />" +
- "<Value Type='DateTime'><Today /></Value>" +
- "</DateRangesOverlap>";
- SPListItemCollection tomorrowEvents = list.GetItems(query);
- foreach(SPListItem event in tomorrowEvents)
- Console.WriteLine(event.Title);
- }
- }
对于其他类型的查询条件,可以参考SDK中的相关章节(在英文版的SDK中,CAML查询参考的位置在:SharePoint Foundation 2010 General Reference – Services References – SharePoint Schema References – CAML Core Schemas – Query Schema)。
3、筛选条件中的逻辑运算
在CAML中也支持多个查询条件的逻辑组合,支持“与”和“或”,但是不支持“非”。通过<And></And>和<Or></Or>标签(注意大小写)进行逻辑运算。
不过需要特别声明的是,And标签和Or标签内部,只能使用两个查询条件。例如如下的查询条件是非法的(Cond表示每个子查询条件):
- <Where>
- <And>
- <Cond1/><Cond2/><Cond3/>
- </And>
- </Where>
应当写成:
- <Where>
- <And>
- <And>
- <Cond1/><Cond2/>
- </And>
- <Cond3/>
- </And>
- </Where>
通过这种方式来保证每个逻辑运算标签内,有且仅有两个子条件。
当然,And标签和Or标签可以进行交替使用,组成复杂的逻辑筛选条件。
4、排序条件
在CAML查询中,使用<OrderBy></OrderBy>指定0至多组排序条件。
查询条件中每个字段按照排列的顺序依次为首要查询条件、次要查询条件、第三查询条件等等,其中每个查询条件的写法为:
- <FieldRef Name='字段名' Ascending='TRUE|FALSE' />
其中的Name属性同样必须使用内部名称,Ascending属性指定是否是正向排序(从小到大),如果不包含该属性,则默认为正向排序。
例如,下面的CAML片段指定了查询的排序条件为先按照作者(内部名称为Author)再按照创建时间由新到旧(内部名称为Created)进行排序:
- <OrderBy>
- <FieldRef Name='Author'/>
- <FieldRef Name='Created' Ascending='FALSE' />
- </OrderBy>
5、返回字段(栏)
进行查询的时候,并非每次都要返回条目的所有字段,出于性能考虑,可以只返回所需要的一些字段,通过制定返回字段来实现这一点,指定返回字段的方式使用<FieldRef Name='字段名' />的形式。
例如,如果需要返回标题、作者和创建时间三个字段,则写法为:
- <FieldRef Name='Title' />
- <FieldRef Name='Author' />
- <FieldRef Name='Created' />
这里同样需要使用字段的内部名称。
转载:http://www.myexception.cn/sharepoint/1857376.html
SharePoint服务器端对象模型 之 使用CAML进展数据查询的更多相关文章
- SharePoint服务器端对象模型 之 使用CAML进行数据查询
(一)概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列表条目的集合. 除去列表上的查询之外,在SharePoint中还大 ...
- SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 2)
(三)使用SPQuery进行列表查询 1.概述 列表查询主要是指在一个指定的列表(或文档库)中按照某些筛选.排序条件进行查询.列表查询主要使用SPQuery对象,以及SPList的GetItems方法 ...
- SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 3)
(四)使用SPSiteDataQuery进行多列表查询 1.概述 前面介绍的列表查询有很多优势,但是它的一个缺点就是一次只能在一个列表中进行查询,在SharePoint中,提供了一个跨网站.跨列表查询 ...
- SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 4)
(五)列表查询中的阈值限制 在之前版本的SharePoint 中,如果在查询的时候没有指定返回数目,那么SharePoint将会查找该列表中所有的条目,这可能会造成在SQL表中需要返回大量的条目,极大 ...
- SharePoint 服务器端对象模型 之 使用LINQ进行数据访问操作(Part 2)
(四)使用LINQ进行列表查询 在生成实体类之后,就可以利用LINQ的强大查询能力进行SharePoint列表数据的查询了.在传统SharePoint对象模型编程中,需要首先获取网站对象,再进行其他操 ...
- SharePoint服务器端对象模型 之 使用LINQ进行数据访问操作(Part 4)
(六)高效合理的使用LINQ 1.DataContext中的两个属性 为了能够使用DataContext进行数据提交,在DataContext进行数据查询和操作的过程中,内部会进行数据状态的保持和追踪 ...
- SharePoint服务器端对象模型 完结
整个系列已完结,大概看了一眼,平均阅读量不到200.估计也没什么人看了,而且服务器端对象模型除了在某些企业开发中会用到,从2013时代开始其实已经不是SharePoint开发的最佳选择了.不过既然已经 ...
- 开启貌似已经过时很久的新坑:SharePoint服务器端对象模型
5年前(嗯,是5年前),SharePoint 2010刚发布的时候,曾经和kaneboy试图一起写一本关于SharePoint 2010开发的书,名字叫<SharePoint 2010 应用开发 ...
- SharePoint服务器端对象模型 之 序言
对于刚刚开始接触SharePoint的开发人员,即使之前有较为丰富的ASP.NET开发经验,在面对SharePoint时候可能也很难找到入手的方向.对于任何一种开发平台而言,学习开发的过程大致会包括: ...
随机推荐
- SQL Server 2014新功能PPT
本篇文章是我在公司内部分享SQL Server 2014新功能的PPT,在本PPT中我详细描述了SQL Server除了BI方面的新功能,以及提供了大量的测试.希望对大家有帮助. 请点 ...
- Spring(四)注解配置Ioc
原文链接:http://www.orlion.ga/216/ 一.@Autowired beans.xml配置成如下: <?xml version="1.0" encodin ...
- MVC4做网站Demo进行重写的问题。
自从学习MVC4开始,边学边写这个demo,写了也有一年多了.开始觉得是一个小例子把所有的代码都写在一个项目中,边写边改越写越混乱,越到后来很多东西自己都理不清了.后来在群里跟 @怒放 在讨论这个问题 ...
- Android图片缓存之初识Glide
前言: 前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架.技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自己的实 ...
- xprivacy改IMEI
XPrivacy是一款基于Xposed框架的模块应用,可以对所有应用可能泄露隐私的权限进行管理,对禁止可能会导致崩溃的应用采取欺骗策略,提供伪造信息.前提你的手机进行root过.我这边使用的是geny ...
- MongoDB一键式安装工具
一. 需求 不知道有多少人会像我一样,会把MongoDB用在客户端应用上,不过我感觉应该非常少.于是,我就希望能在客户机器上尽可能简单方便的安装MongoDB.所以以下是我的一些取舍: 1. 我只使用 ...
- Easyui datagrid加载本地Json数据,CGI数据
网上示例(记得引用Jquery): [html] view plaincopy var jsonstr = '{"total":1,"rows":[{" ...
- 订制DOM选择器
本来是打算参考zepto.js,然后将里面想要的部分抽出来做函数,随调随用. 但后面发现这种写法重复代码太多,代码不整洁,于是就打算模仿下zepto的写法,挑出些比较实用的方法,造一下轮子. 起名叫“ ...
- 相克军_Oracle体系_随堂笔记008-存储结构
控制文件.数据文件.日志文件 放在存储上. 参数文件:数据库启动时读取,并不关闭,但是启动过后丢了也没事.一般放在服务器上. $ORACLE_HOME/dbs下 备份文件{ 控制 ...
- springMVC学习笔记(二)-----注解和非注解入门小程序
最近一直在做一个电商的项目,周末加班,忙的都没有时间更新博客了.终于在上周五上线了,可以轻松几天了.闲话不扯淡了,继续谈谈springMvc的学习. 现在,用到SpringMvc的大部分使用全注解配置 ...