进行WSS3或MOSS开发的朋友不可避免的要处理各种List的查询,编写类似下面的CAML语句:

<Where>
<And>
 <And>
  <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
  <Eq><FieldRef Name=”ContentType”><Value Type=”Text”>Product</Value></Eq>
 </And>
 <Eq><FieldRef Name=”Field1”><Value Type=”Text”>Value</Value></Eq>
</And> 
<Or>
 <Or>
  <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
  <Eq><FieldRef Name=”ContentType”><Value Type=”Text”>Product</Value></Eq>
 </Or>
 <Eq><FieldRef Name=”Field1”><Value Type=”Text”>Value</Value></Eq>
</Or> 
</Where>

痛苦吧? 简单的还好,复杂一点的caml查询绝对会让你晕头转向。
现在网上的解决方案有几种:
1)CAMLBuilder:提供一个Window程序,可以动态生成CAML,然后开发人员可以粘贴进代码代码中。
http://blog.u2u.info/DottextWeb/patrick/archive/2005/05/29/3522.aspx
2)CAML.net : 提供了一个类库,可以如下的编写CAML:
http://www.codeplex.com/camldotnet

string typeName = "My Content Type";
string simpleQuery =
    CAML.Query(
        CAML.Where(
            CAML.Or(
                CAML.Eq(
                    CAML.FieldRef("ContentType"), 
                    CAML.Value(typeName)),
                CAML.IsNotNull(
                    CAML.FieldRef("Description")))),
        CAML.GroupBy(
            true,
            CAML.FieldRef("Title",CAML.SortType.Descending)),
        CAML.OrderBy(
            CAML.FieldRef("_Author"),
            CAML.FieldRef("AuthoringDate"),
            CAML.FieldRef("AssignedTo",CAML.SortType.Ascending))
    );

3)还有一位兄弟写了个支持用sql语句形式的caml类库,查询语句如下:

SPWeb web = SPContext.Current.Web;
string queryStr = "SELECT * FROM 通知 WHERE ID>10";
FriendlyQuery query = new FriendlyQuery(web, queryStr);
query.RowLimit = 100;
query.Scope = FriendlyQuery.QueryScope. AllItemsAndFolders;
SPListItemCollection items = query.GetItems();
foreach(SPListItem i in items)
    Response.Write(i.Title + "<br/>");

上面的三种方案,个人还是比较喜欢CAML.net的实现,纯代码,但是它的语法不是那么的"优雅"。
以前写过一个数据库ORM工具,见(DBO),实现了如下的数据查询语法:

QueryExpression expr =
             DboQuery.Select( User.__UserName,Org.__OrgName )
             .From<User>()
             .InnerJoin<Org>().On(User.__OrgId, Org.__OrgId)
             .Where(Org.__OrgId == 2 | Org.__OrgId == 3);
 IList<RefOrgUser> orgs = _session.Query<RefOrgUser>(expr) ;

于是,计划开发类似语法的CAML查询类库--CodeArt.SharePoint.CAMLQuery.dll。
07年六月份开始开发,已经用到了实际的项目中,实现了几个复杂的查询功能,好东西不敢独享,哈哈,给大家show一下。
(在后面大家可以找到dll的下载链接)
以下的代码示例针对一个列表CAMLList做查询,此列表有如下字段:标题,正文,修改时间。

首先,引用名称空间。

using System.Data;
using Microsoft.SharePoint;
using CodeArt.SharePoint.CAMLQuery;

代码1:查询标题中包含"XXX"的 项目:

  QueryField titleField = new QueryField("标题");

  SPSite site = new SPSite("http://jyserver:9000");
  SPList list =  site.RootWeb.Lists["CAMLTest"];

   SPQuery q = new SPQuery ();
   q.Query = CAMLBuilder.Where( list , titleField.Contains("XXX") );
           
   SPListItemCollection items = list.GetItems(q);
   int count = items.Count;         

代码2:查询标题中包含"XXX"或"YYY"的 项目:

 SPList list = this.GetTestList();

  ICAMLExpression expr = QueryModel.Title.Contains("XXX") || QueryModel.Title.Contains("YYY");            

  PQuery q = new SPQuery();
  q.Query = CAMLBuilder.Where(list, expr );

  SPListItemCollection items = list.GetItems(q);
  int count = items.Count;

代码3:我们可以创建一个查询模型,类似一个实体类,针对这个类进行查询:

/**//// <summary>
        /// 查询模型
        /// </summary>
        class QueryModel
        {
            public static FieldRef<QueryModel> Title = new FieldRef<QueryModel>("标题");
            public static FieldRef<QueryModel> Body = new FieldRef<QueryModel>("正文");
            public static TypeFieldRef<QueryModel, DateTime> ModifyTime = new TypeFieldRef<QueryModel, DateTime>("修改时间");
        }
        [TestMethod]
        public void TestModelQuery()
        {          
            SPList list = this.GetTestList();
            SPQuery q = new SPQuery();
            q.Query = CAMLBuilder.Where( list ,  QueryModel.Title.Contains("XXX") );
            q.ViewFields = CAMLBuilder.ViewFields( list , QueryModel.Title, QueryModel.Body);
            SPListItemCollection items = list.GetItems(q);
            int count = items.Count;
        }

代码4:按照逻辑动态拼接查询,以下示例查询标题中包含"XXX"或"YYY"的 项目,按照queryByTime 参数,附加修改时间条件:

 SPList list = this.GetTestList();

  bool queryByTime = true ;

  TypedCAMLExpression<QueryModel> expr = QueryModel.Title.Contains("XXX") || QueryModel.Title.Contains("YYY");  
        
  if( queryByTime )
        expr = expr & QueryModel.ModifyTime >= DateTime.Now.AddDays(-1)

   SPQuery q = new SPQuery();
   q.Query = CAMLBuilder.Where(list, expr );

   SPListItemCollection items = list.GetItems(q);
  int count = items.Count;

代码5:我们可以用类似sql的强类型语法:

 QueryField titleField = new QueryField("标题");
QueryField bodyField = new QueryField("正文");

            SPList list = this.GetTestList();
          //只查询两个字段
            SPListItemCollection result1 =
                ListQuery.Select(titleField, bodyField)
                        .From(list)
                        .Where(titleField.Contains("XXX"))
                        .GetItems();

            int count = result1.Count;
          //查询所有字段
            SPListItemCollection result2 =
                ListQuery.From(list)
                         .Where(titleField.Contains("XXX"))
                         .GetItems();

            int count2 = result2.Count;

          //直接返回DataTable
            DataTable result3 =
                ListQuery.Select(titleField,bodyField)
                        .From(list)
                         .Where(titleField.Contains("XXX")|titleField.Contains("YYY"))
                         .OrderBy( titleField , false )
                         .GetDataTable();

            int count3 = result3.Rows.Count;

下载dll: https://www.codeplex.com/camlquery

最新版本的接口可能有变化,使用时请参考最新的文档。

附:
原来还有第五种方案: 用 .net3.5的朋友可以试试LINQtoSharePoint,跟o这个.net2.0的好像差不多:
http://www.codeplex.com/LINQtoSharePoint

转载于:https://www.cnblogs.com/NetUser/archive/2013/03/11/2954191.html

【转】WSS3.0开发--你还在为写CAML痛苦吗?相关推荐

  1. Struts 2创始人Patrick Lightbody看《精通Struts 2:Web 2.0开发实战 》

    <精通Struts 2:Web 2.0开发实战 > Apache Struts是目前最成功开源项目之一.除了一些基础性项目如Linux.MySQL以及若干编程语言外,很少有开源框架能像St ...

  2. From 《visual C++ 6.0开发工具与调试》

    From <visual C++ 6.0开发工具与调试> 1.          如何快速地规范代码缩进格式 选中所需要规范的代码,按shift+F8 2.          如何在Rel ...

  3. 这就是华为速度:2.69分钟完成BERT训练!新发CANN 5.0加持,还公开了背后技术

    金磊 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 快,着实有点快. 现在,经典模型BERT只需2.69分钟.ResNet只需16秒. 啪的一下,就能完成训练! 这是华为全联接2021上 ...

  4. Windows Embedded CE 6.0开发初体验(二)CE开发环境 收藏

    上一篇<Windows Embedded CE 6.0开发初体验>之"嵌入式开发流程": http://blog.csdn.net/aawolf/archive/200 ...

  5. WSS2.0升级到WSS3.0

    WSS2.0升级到WSS3.0的过程: 1.检查服务器上面是否安装.Net Framework3.0(必须要安装的). 2.安装WSS3.0(安装后别做配置) 选择第一项(逐步升级),默认的是第二项( ...

  6. 图解TC++3.0开发教程

    第一章 开发环境 在Win7下安装tcpp3 老一些的程序员也许都用过DOS下经典的Turbo C 2.0.现在还记得大学时期到中关村盗版光盘贩子处买Turbo C 2.0光盘的情形.下面将安装tcp ...

  7. qt5.9.0调试如何查看变量的值_从0开发3D引擎(四):搭建测试环境

    大家好,本文介绍了3D引擎的测试方法,搭建了本地的测试环境. 上一篇博文 wonder-yyc:从0开发3D引擎(三):搭建开发环境​zhuanlan.zhihu.com 下一篇博文 wonder-y ...

  8. CodeArt WSS3.0(MOSS)字段编辑权限控制解决方案(v1.0)

    Windows SharePint Service 3.0(或MOSS)默认不支持字段级的权限.而在项目的实施过程中,客户经常会提出这个需求. 解决方案有两种: 1)开发自定义的字段,在字段上附加控制 ...

  9. ASP.Net分页组件1.0开发下载了...

    ASP.Net分页组件1.0开发下载了...支持皮肤和自定义样式.热乎乎的,写的不好的地方指正出来啊... 开源免费的.希望大家多多支持... ASP.Net分页组件1.0开发下载了...支持皮肤和自 ...

最新文章

  1. 关于mysql的error-based injection payload
  2. HDU4405(概率DP求期望)
  3. Python标准模块--logging
  4. 基于I2C总线的MPU6050学习笔记
  5. PhantomJS命令行选项
  6. 12306加密传输_前沿一键发送“文图音视频” 支持加密传输、图形密码、保护用户隐私……5G消息要来了!...
  7. 机器人环境感知算法之经典阶段
  8. Java集合与数组实现升序排序的算法设计
  9. 蓝桥杯C语言基础题---01字串
  10. java 详情页_电商网站详情页系统架构
  11. A*求解带时间窗的路径规划问题
  12. Astah Professional for Mac(UML建模工具)
  13. java obj_java中的 compareTo(Object obj)的obj怎么理解
  14. 梦想家CMS内容管理系统(毕业设计)
  15. delphi下使用indy进件socket通信的简单实例介绍
  16. SuperView和View的区别
  17. 展望未来综合型人工智能教育应用
  18. 日记01 2021年5月
  19. 为什么mos管反相器要用pmos管和nmos管构成
  20. bugku 游戏过关

热门文章

  1. js获取video的时长_HTML5标签之lt;videogt;二次开发(一) — 为什么(后跟重要知识点!)...
  2. tcp序列号为什么是随机的_每个开发人员都应该掌握的TCP知识
  3. bs架构 mysql_基于BS架构OA办公系统的设计(PHP,MySQL)(三人组)(含录像)
  4. 神策数据入选“2021CCFA 零售行业技术新锐企业榜单”
  5. 特别的彩蛋给特别的你,新版官网上线啦!
  6. Asp中解决AJAX乱码问题
  7. 构造方法、类的初始化块以及类字段的初始化顺序
  8. PPT幻灯片从自动翻页设置为手动翻页技巧图文教程
  9. 7月13日微软MVP社区夏日巡讲北京站活动现场图集
  10. 网络学习(二十七)Windows XP 加入 Windows Server 2003 Active Directory