CAML语句 多条件and使用

2023-10-11 09:30
文章标签 条件 使用 语句 caml

本文主要是介绍CAML语句 多条件and使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求是一个不固定条件的查询,要组合三个不固定的条件,就是说可能是一个,2个或者3个(即模糊查询);

 

起初,我通过视图把我所需要的用视图的filter进行构造,当时我构造了两个条件,通过工具找到该CAML 语句,语句如下:

 

 

复制代码
<Query>

    <Where>

      <And>

           <Contains>

            <FieldRef Name="Department" />

            <Value Type="Text">cbu</Value>

          </Contains>

          <Contains>

            <FieldRef Name="Location" />

            <Value Type="Text">suzhou</Value>

          </Contains>

      </And>

    </Where>

 </Query>


 

于是我试想三个条件不就是如下语句了:

 


代码 
 <Query>

    <Where>

      <And>

          <Contains>

            <FieldRef Name="Department" />

            <Value Type="Text">cbu</Value>

          </Contains>

          <Contains>

            <FieldRef Name="Location" />

            <Value Type="Text">suzhou</Value>

          </Contains>

        <Contains>

          <FieldRef Name="Publisher" />

          <Value Type="Text">kingstar</Value>

        </Contains>

      </And>

    </Where>

 </Query>


复制代码

 

 

结果运行出来出现了如下

Error: One or more field types are not installed properly. Go to the list settings page to delete these fields.

于是我Google了下,很多人也碰到这个问题,

http://social.msdn.microsoft.com/Forums/en/sharepointdevelopment/thread/a2c6bed0-eee1-4f9b-b468-fc57c2e45c16 

以为是列表问题,于是按上面的方法处理了下,还是这个结果,怎么办呢?

别着急啊,嘿嘿,这回只能静下心来一个个找原因了,于是我试了下用两个条件处理,意外的发现可以了,结果才知道是CAML 语句的问题,也就是

这么写是对的:

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

这么写是错的:

<And>
 <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
 <Eq><FieldRef Name=”Conte ntType”><Value Type=”Text”>Product</Value></Eq>
 <Eq><FieldRef Name=”Field1”><Value Type=”Text”>Value</Value></Eq>
</And>

于是我总结出:<And>和<Or>标签里面是不能同时套3个或更多比较标签的。

 

举例:

 

这么写是对的:

 

复制代码
<And>
 <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
 <Eq><FieldRef Name=”ContentType”><Value Type=”Text”>Product</Value></Eq>
</And>

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

复制代码

 

 

但这么写是错的:

 

代码

 

 

那如果需要同时And多个怎么办?

这样:

 

复制代码
<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> 

复制代码

 

 

按上面的写法,多个And 不是要判断很多次,如果一个页面有100个查询条件,不是写出人命来了,有没更简便的方法呢?答案当然是有的啦,请耐心看下去吧,(*^__^*)

 

经过尝试我的解决方案如下:通过计时器去计算查询条件,继而得到And应该出现的次数,对CAML 语句进行构造,以下是该方法:

     

复制代码
/// <summary>

        ///查询条件的拼接

       /// </summary>

        /// <param name="fieldvalue">字段的值/param>

        /// <param name="fieldname">字段名</param>

        /// <param name="fieldtype">字段的类型</param>

        /// <returns>模糊查询语句CAML</returns>

        protected string GetSPQuery(string fieldvalue,string fieldname, string fieldtype)

        {

                System.Text.StringBuilder strbuilder = new System.Text.StringBuilder();

                if (fieldvalue.Trim() != string.Empty)

                {

                    if (int.Parse(ViewState["countand"].ToString()) >= 1)

                    {

                        strbuilder.Append("<Contains>");

                        strbuilder.Append("<FieldRef Name=\"" + fieldname + "\" />");

                        strbuilder.Append(" <Value Type=\"" + fieldtype + "\">" + fieldvalue + "</Value>");

                        strbuilder.Append(" </Contains>");

                        strbuilder.Append("</And>");

                    }

                    else

                    {

                        strbuilder.Append("<Contains>");

                        strbuilder.Append("<FieldRef Name=\"" + fieldname + "\" />");

                        strbuilder.Append(" <Value Type=\"" + fieldtype + "\">" + fieldvalue + "</Value>");

                        strbuilder.Append(" </Contains>");

                       

                    }

                    ViewState["countand"] =int.Parse(ViewState["countand"].ToString()) + 1;

                    return strbuilder.ToString();

                }

                else

                    return string.Empty;

        }

复制代码

 

 

光有上面这个方法还是不够的,因为这个只有And的结束语句的构造,And 起始个数的构造呢,请看如下语句吧:

 

复制代码
System.Text.StringBuilder strbulider = new System.Text.StringBuilder();

            System.Text.StringBuilder strbuliderEnd = new System.Text.StringBuilder();

           // strbulider.Append(" <OrderBy><FieldRef Name=\"ID\" /> </OrderBy>");

            strbulider.Append("<Where>");

 

            strbuliderEnd.Append(GetSPQuery(txtDepartment.Text.Trim(), "Department", "Text"));

           strbuliderEnd.Append(GetSPQuery(txtLocation.Text.Trim(), "Location", "Text"));

            strbuliderEnd.Append(GetSPQuery(txtPublisher.Text.Trim(), "Publisher", "Text"));

 

            for (int i = 2; i <= int.Parse(ViewState["countand"].ToString()); i++)

            {

                strbulider.Append("<And>");

               

            }

            strbulider.Append(strbuliderEnd.ToString());

            strbulider.Append("</Where>");

            query.Query = strbulider.ToString();

转载于:https://www.cnblogs.com/dengyuxuan/p/SharePoint.html

这篇关于CAML语句 多条件and使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/187116

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构