SharePoint CAML In Action——Part I
在SharePoint中,我们经常要对List进行操作,比如要从List中取出相应的ListItem,利用CAML是个好办法。在没了解CAML之前,我是这样取数据的:
MyList.Items.Cast<SPListItem>().ToList().Where(Condition).Select(Fields);
原谅我当初如此放荡不羁的写法吧。
- 好了,现在进入CAML实战中,首先CAML (Collaborative Application Markup Language)基于XML的一种语言。所以你写CAML时一定要注意Tag是否闭合,另外CAML也是区分大小写的。
正巧在看蝙蝠侠,可以将SPList对象可以看成是银行,SPListItem对象可那么以看成银行库里一排排保险柜,SPListItem的Fields就代表每一个保险柜中的存放的财富(比如黄金、钻石、美元)。所以可以把CAML比作型号各式的子弹的话,那SharePoint SPQuery对象就是蝙蝠侠中的小丑,在抢银行之前必须把子弹上膛,对,SPQuery对象的Query属性就是一把可以匹配任何子弹万能武器,ViewFields就是你要抢的财富类型(黄金、钻石、美元),RowLimit就是抢得一定数量的财富就跑路了,而返回的SPListItemCollection集合就是抢到的财富。
是不是感到很晕,没事,先有个概念即可。我以一个简单入门的例子,你就会明白了,当然我的比喻也是即兴发挥的,有不妥也别见怪。
CAML In Action
首先我准备两个List,一个Employee,一个Specialization,为我们提供测试数据,其中Employee中的Specialization列是查阅项类型,引用了Specialization List的数据。
- Employee

- Specializaion

现在如果想在Employee List中取出Specialization包括CSS,并且Age大于20岁,并且还是女性的Employees。
这时你脑海中的逻辑表达式为:Specialization=CSS And Age>20 And IsMale=False。
接着你需要把上述的逻辑表达式转换为CAML语言,如下:

任何给定的And元素只能有2个结合体,即只能由2个字元素,如果需要结合3个或者更多的And条件,则必须以一个条件的形式嵌套在父And中,依次类推下去。
- 当查询时,免不了要对结果进行排序等,这时OrderBy就可用上,比如我要对上述结果进行以Age降序形式排序,则CAML:
<OrderBy>
<FieldRef Name='Age' Ascending ='False'/>
</OrderBy>
- 所以完整的查询部分CAML如下:
<Where>
<And>
<And>
<Eq>
<FieldRef Name='Specialization'/>
<Value Type='Lookup'>CSS</Value>
</Eq>
<Gt>
<FieldRef Name='Age'/>
<Value Type='Number'>20</Value>
</Gt>
</And>
<Eq>
<FieldRef Name='IsMale'/>
<Value Type='Integer'>0</Value>
</Eq>
</And>
</Where>
<OrderBy>
<FieldRef Name='Age' Ascending ='False'/>
</OrderBy>
- 当然,你可以指定从查询中返回的Fields,SPQuery对象的ViewFields属性就是代表从查询中返回的Fields:
query.ViewFields = "<FieldRef Name='Title'/><FieldRef Name='Age'/>";
- 当数据量过多时,也可以限制返回的行数:
query.RowLimit = ;
- 所以完整的利用CAML进行查询的代码如下:
SPList spList = spWeb.Lists.TryGetList("Employee");
if (spList != null)
{
SPQuery query = new SPQuery();
query.Query = @"
<Where>
<And>
<And>
<Eq>
<FieldRef Name='Specialization'/>
<Value Type='Lookup'>CSS</Value>
</Eq>
<Gt>
<FieldRef Name='Age'/>
<Value Type='Number'>20</Value>
</Gt>
</And>
<Eq>
<FieldRef Name='IsMale'/>
<Value Type='Integer'>0</Value>
</Eq>
</And>
</Where>
<OrderBy>
<FieldRef Name='Age' Ascending ='False'/>
</OrderBy> ";
query.ViewFields = "<FieldRef Name='Title'/><FieldRef Name='Age'/>";
query.RowLimit = ;
var listItemsColl = spList.GetItems(query);
- 最后感兴趣的朋友可以通过调试看一下最终生成的CAML:以View开头,而我们写的查询条件被包含在Query节点下:

接下来
这篇博客没有过多的去讲什么是CAML以及CAML的查询元素,而是以一个Example展示了如何用CAML从List中获取相应的ListItemCollection,接下来的一篇博客会对CAML语法进行一个快速参考。
SharePoint CAML In Action——Part I的更多相关文章
- SharePoint CAML In Action——Part II
在SharePoint中,相对于Linq to SharePoint而言,CAML是轻量化的.当然缺点也是显而易见的,"Hard Code"有时会让你抓狂.在实际场景中,经常会根据 ...
- SHAREPOINT - CAML列表查询
首先要了解的是CAML(Collaboration Application Markup Language)不仅仅是用在对列表.文档库的查询,字段的定义,站点定义等处处使用的都是CAML. 简单的提一 ...
- SharePoint 2010/SharePoint 2013 Custom Action: 基于Site Collection 滚动文字的通知.
应用场景: 有时候我们的站点需要在每个页面实现滚动文字的通知,怎么在不修改Master Page的情况下实现这个功能?我们可以使用Javascript 和 Custom Action 来实现. 创建一 ...
- SharePoint CAML Query小结
CAML的结构. <View Type="HTML" Name="Summary"> <ViewBody ExpandXML="TR ...
- Overcoming the List View Threshold in SharePoint CAML queries
From: https://www.codeproject.com/articles/1076854/overcoming-the-list-view-threshold-in-sharepoint- ...
- SharePoint - CAML
1. CAML是顺序操作,如果要实现类似 “A or B or C or D” 的结果,最好写成 “(((A or B) or C) or D)”的形式,但写成 “((A or B) or (C or ...
- Sharepoint CAML 增删改查 List
Lists.UpdateListItems 方法 (websvcLists) Windows SharePoint Services 3 Adds, deletes, or updates the ...
- 深入浅出SharePoint——Caml快速开发
适用于Visual Studio 2010的Caml智能感知工具 http://visualstudiogallery.msdn.microsoft.com/15055544-fda0-42db-a6 ...
- [总结]SHAREPOINT - CAML列表查询(上)
首先要了解的是CAML(Collaboration Application Markup Language)不仅仅是用在对列表.文档库的查询,字段的定义,站点定义等处处使用的都是CAML. 简单的提一 ...
随机推荐
- C++ 第四课:ASCII 码表
下面的 ASCII 码表包含数值在0-127之间的字符的十进制.八进制以及十六进制表示. 十进制 八进制 十六进制 字符 描述 0 0 00 NUL 1 1 01 SOH start of hea ...
- C#判断网站是否能访问或者宕机的方法
最近有位朋友说他有很多网址,可能有些已经过期或者不能访问了.自己去一个一个点可以,但又很麻烦! 再过一段时间又要去检查一次,每次都这样就不方便了! 于是就做了个小程序给帮他检测一下. 以下做了一个例子 ...
- stingray 页面布局与设计
前言 前面我们已经了解了系统中的HTML组件,现在我们就可以开始用这些组件来设计页面了,他们就像是一块块小积木,我们要盖起高楼大厦. 两种页面容器组件 我们将关联性较强的多个HTML组件放到一个容器组 ...
- 转:VS2013快捷键大全
Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL ...
- oracle中extract()函数----用于截取年、月、日、时、分、秒
oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分 语法如下: extract ( { year | month | day ...
- Maven让资源文件处理插件能够解析资源文件中的Maven属性
<build> <resources> <resource> <directory>${project.basedir}/src/main/resour ...
- 使用c语言调用python小结
近期在做一个漏洞展示平台,攻击实现部分使用python实现.c语言实现部分使用libcli库做一个类似telnet的东东,回调函数run的时候调用python模块. 针对c调用python,做个了小d ...
- GDAL添加ECW格式支持
目录 GDAL添加ECW格式支持 ECW 下载ECW JPEG SDK 在Unix平台构建支持ECW的GDAL 二进制ECW SDK和GCC >= 5.1 在Linux上构建的教程 在Windo ...
- Ubuntu16.04下添加打印机FujiXerox CP116w
今天要打印一份北马的成绩单, 不想重启机器了, 在Ubuntu下尝试添加打印机, 最后成功了, 记录一下 打印机型号是FujiXerox CP116w, 通过WIFI连接的, 在Ubuntu16.04 ...
- 给Java程序员的几条建议
对于Java程序猿学习的建议 这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是LZ你是如何学习Java的,能不能给点建议? 今天LZ是打算来点干货,因此咱们就不说一些学 ...