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

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

1、概述web

在SharePoint的开发应用中,查询是很是经常使用的一种手段,根据某些筛选、排序条件,得到某个列表或者某一些列表中相应的列表条目的集合。数据库

除去列表上的查询以外,在SharePoint中还大量存在着各类各样的查询,好比针对回收站的SPRecycleBinQuery、针对审计的SPAuditQuery、针对变动的SPChangeQuery等等,不过这些查询在实际项目中使用到的频率并非很高。本章节仍是着重介绍列表查询功能。服务器

在SharePoint 2010以前,列表查询的查询语句都是经过CAML这样一种XML格式来编写的。对于开发人员来说,准确快速地编写出较为复杂的CAML查询并不是是一件垂手可得的事情,可是使用CAML进行数据查询还是SharePoint开发中不可或缺的技能。本节将介绍如何使用CAML进行列表查询和跨多个列表之间的查询,在下一节中将介绍SharePoint 2010新引入的列表查询方式——LINQ。性能

 

2、CAML查询字符串网站

在列表查询中,全部的查询条件都要使用一种Xml形式的语法进行描述,这种Xml语法被称做CAML(Collaborative Application Markup Language),是SharePoint中一种特定的Xml语法。实际上,在SharePoint中不只是列表查询使用了CAML,在网站、列表、字段、内容类型、网站功能等各类对象的定义中,也大量使用了CAML格式的Xml。spa

CAML查询字符串总的来讲能够分为3大部分:筛选条件、排序和分组条件、返回字段。code

在编写CAML字符串的时候,须要特别注意Xml标签的大小写是敏感的。htm

 

一、筛选条件对象

使用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语句写法,应该是形如:

1 SELECT * FROM xxList WHERE 标题 Contains '对象模型' 

可是在SharePoint中,使用CAML格式描述后,就变成了:

1  <Where>
2   <Contains>
3     <FieldRef Name='Title' />
4     <Value Type='Text'>对象模型</Value>
5   </Contains>
6 </Where>

从查询条件的格式中能够看出,SharePoint在进行列表查询的时候,只支持字段与值的比较,而不支持两个字段之间的比较,这是一个较大的限制。

 

二、一些特殊的筛选条件

这里列出一些比较特殊的筛选条件的写法(均省略其中的Where标签):

(1)包含在集合范围内的查询,这是SharePoint 2010新增长的一种查询类型,使用“In”操做符来查询包含在指定范围内的集合。例以下面的例子查找了Writer包含在[“Erucy”, “Windie”]集合的章节(即Writer等于Erucy或Windie的章节):

1 <In>
2   <FieldRef Name='Writer'/>
3   <Values>
4     <Value Type='Text'>Erucy</Value>
5     <Value Type='Text'>Windie</Value>
6   </Values>
7 </In>

 

(2)“是/否”类型的查询,该类型在数据库中其实是bool类型,在查询的时候使用“1”表示“是”,使用“0”表示“否”,例如:

1 <Eq>
2    <FieldRef Name='BoolField'/>
3    <Value Type='Boolean'>1</Value>
4  </Eq>

(3)某我的员和组类型的字段等于当前用户,若是是多选的话其中包含当前用户:

1 <Eq>
2   <FieldRef Name='UserField'/>
3   <Value Type='Integer'><UserID/></Value>
4 </Eq>

(4)若是某个“用户或用户组”类型的字段填写的是用户组,筛选用户组包含当前用户的:

1 <Membership Type='CurrentUserGroups'>
2   <FieldRef Name='UserField'/>
3 </Membership>

(5)默认状况下,对于时间和日期类型的查询只精确到日期,若是须要精确到时间:

1 <Gt>
2   <FieldRef Name='DateTimeField' />
3   <Value Type='DateTime' IncludeTimeValue='TRUE'>
4     2009-10-08T17:48:37Z
5   </Value>
6 </Gt>

(其中的日期格式能够经过使用一个静态方法SPUtility.CreateISO8601DateTimeFromSystemDateTime转换获得)

(6)通常状况下,进行查阅项或用户筛选的时候,可使用Text类型的Value,判断查阅的列表条目的文本或用户的现实名称的字符串;若是须要精确按照被查阅条目的ID或用户的ID进行查找的话(对于多选查阅项和多选用户也应使用Eq操做符,而不是Contains操做符):

1 <Eq>
2   <FieldRef Name='LookupField' LookupId='TRUE'/>
3   <Value Type='Lookup'>37</Value>
4 </Eq>

(7)在日历模板类型的列表中,当须要查询某个指定时间范围内的事件的时候,若是是经过Gt/Geq和Lt/Leq方式查找,仅能查找到非重复事件,以及重复事件的第一次事件,为了可以准确地查找某个范围内的重复事件,须要使用DateRangesOverlap查询操做符,并配合SPQuery的一些属性进行。(在跨列表查询中不支持重复事件)

1 <DateRangesOverlap>
2   <FieldRef Name='EventDate' />
3   <FieldRef Name='EndDate' />
4   <FieldRef Name='RecurrenceID' />
5   <Value Type='DateTime'>
6     <Today />
7   </Value>
8 </DateRangesOverlap>

 DateRangesOverlap操做符的写法相对比较固定,其中的EventDate是“开始时间”的内部名称;EndDate是“结束时间”的内部名称;RecurrenceID是某个和重复事件相关字段的内部名称。Value中的标签订义了查询的范围,包含以下4种:<Today/>(天)、<Week/>(周)、<Month/>(月)、<Year/>(年)。

查询的时候须要配合使用SPQuery的两个属性:ExpandRecurrence(bool类型)须要设置为true,表示查询的时候展开重复事件(即便没有重复事件,在使用操做符DateRangesOverlap的时候也应当设置此属性);CalendarDate(DateTime类型),设置查询范围的日期。例如,下面的程序查询了明天的全部事件(咱们能够先提早了解一下SPQuery的使用):

 1 using(SPSite site = new SPSite("http://sp2010/book"))
 2 {
 3   using(SPWeb web = site.OpenWeb())
 4   {
 5     SPList calList = web.Lists["日历"];
 6     SPQuery query = new SPQuery();
 7     query.ExpandRecurrence = true;
 8     query.CalendarDate = DateTime.Today.AddDays(1);
 9     query.Query = "<DateRangesOverlap>" +
10             "<FieldRef Name='EventDate' />" +
11             "<FieldRef Name='EndDate' />" +
12             "<FieldRef Name='RecurrenceID' />" +
13             "<Value Type='DateTime'><Today /></Value>" +
14             "</DateRangesOverlap>";
15     SPListItemCollection tomorrowEvents = list.GetItems(query);
16     foreach(SPListItem event in tomorrowEvents)
17       Console.WriteLine(event.Title);
18   }
19 }

对于其余类型的查询条件,能够参考SDK中的相关章节(在英文版的SDK中,CAML查询参考的位置在:SharePoint Foundation 2010 General Reference – Services References – SharePoint Schema References – CAML Core Schemas – Query Schema)。

 

三、筛选条件中的逻辑运算

在CAML中也支持多个查询条件的逻辑组合,支持“与”和“或”,可是不支持“非”。经过<And></And>和<Or></Or>标签(注意大小写)进行逻辑运算。

不过须要特别声明的是,And标签和Or标签内部,只能使用两个查询条件。例如以下的查询条件是非法的(Cond表示每一个子查询条件):

1 <Where>
2   <And>
3     <Cond1/><Cond2/><Cond3/>
4   </And>
5 </Where>

应当写成:

1 <Where>
2   <And>
3     <And>
4       <Cond1/><Cond2/>
5     </And>
6     <Cond3/>
7   </And>
8 </Where>

经过这种方式来保证每一个逻辑运算标签内,有且仅有两个子条件。

固然,And标签和Or标签能够进行交替使用,组成复杂的逻辑筛选条件。

 

四、排序条件

在CAML查询中,使用<OrderBy></OrderBy>指定0至多组排序条件。

查询条件中每一个字段按照排列的顺序依次为首要查询条件、次要查询条件、第三查询条件等等,其中每一个查询条件的写法为:

1 <FieldRef Name='字段名' Ascending='TRUE|FALSE' />

其中的Name属性一样必须使用内部名称,Ascending属性指定是不是正向排序(从小到大),若是不包含该属性,则默认为正向排序。

例如,下面的CAML片断指定了查询的排序条件为先按照做者(内部名称为Author)再按照建立时间由新到旧(内部名称为Created)进行排序:

<OrderBy>
  <FieldRef Name='Author'/>
  <FieldRef Name='Created' Ascending='FALSE' />
</OrderBy>

 

五、返回字段(栏)

进行查询的时候,并不是每次都要返回条目的全部字段,出于性能考虑,能够只返回所须要的一些字段,经过制定返回字段来实现这一点,指定返回字段的方式使用<FieldRef Name='字段名' />的形式。

例如,若是须要返回标题、做者和建立时间三个字段,则写法为:

1 <FieldRef Name='Title' />
2 <FieldRef Name='Author' />
3 <FieldRef Name='Created' />

这里一样须要使用字段的内部名称。

 

转载:http://www.myexception.cn/sharepoint/1857376.html

相关文章
相关标签/搜索