• 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 = 1000;
    • 所以完整的利用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 = 10;
                         var listItemsColl = spList.GetItems(query);
    • 最后感兴趣的朋友可以通过调试看一下最终生成的CAML:以View开头,而我们写的查询条件被包含在Query节点下:

    接下来

    这篇博客没有过多的去讲什么是CAML以及CAML的查询元素,而是以一个Example展示了如何用CAML从List中获取相应的ListItemCollection,接下来的一篇博客会对CAML语法进行一个快速参考。

  • 相关阅读:
    web前端之jQuery
    java之awt编程
    java连接数据库的基本操作
    实习生应聘经历2018/3/1
    javaweb学习之建立简单网站
    mysql之视图
    71. Simplify Path
    347. Top K Frequent Elements
    7. Reverse Integer
    26. Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/OceanEyes/p/sharepoint-caml-in-action-one.html
Copyright © 2020-2023  润新知