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();

时间: 2025-01-04 02:02:11

CAML语句 多条件and使用的相关文章

SQL LIKE语句多条件贪婪匹配算法

在CMS开发中,经常会有类似这样的需求: 提问——回答模式,最经典的例子就是百度提问. 提问者提出问题,由其他人回答,其他人可以是用户,也可以是服务商. 在这个模式中,如何充分利用历史数据是最关键的技术.很多时候,由于客户不擅长使用搜索功能,一上来就提问,而这些问题往往早已经有近乎完美的答案,但没有充分利用.这样一来,不仅加大了劳动量,又增加了数据冗余. 如果在提问的时候能充分调动历史数据,提交问题之前先看看历史问题能不能解决客户疑问,解决了,最好不过,解决不了,再提交.百度提问就是采用的这种方

if语句多条件判断

想要编写一个简单的ping测试脚本,由用户输入起始和中指IP地址.其中需要判断用户输入的IP地址必须是0-255的访问,使用if语句进行条件判断如下: if [ "${beginum}" -lt 0 ] || [ "${beginnum}" -gt 255 ] || [  "${endnum}" -lt 0 ] || [  "${endnum}" -gt 255 ] 运行的时候报错,经过几次尝试才知道这种if [ 条件1 ||

sql语句查询条件的不同表达方式对查询性能的影响

今天操作数据库遇到一个问题 目标表RA_AD_DAILY_DATA的数据量大概有5千万左右,其中的BUSINESS_DATE字段为日期类型 我要查询8月20号导入的三条记录,刚开始用这种方式去查: SELECT * FROM RA_AD_DAILY_DATA WHERE  to_char(BUSINESS_DATE,'yyyy-MM-dd')= '2014-08-20' ; 速度非常慢,五分钟左右才能出来结果(在PL/SQL developer中) 同样都是查询2014年8月20日的数据,换一种

把从1到1000的数打印出来,但你不能使用任何的循环语句或是条件语句。

来看一个很有意思的一个题目. 题目是这样的: 请把从1到1000的数打印出来,但你不能使用任何的循环语句或是条件语句. 看到这个题当时我也是蒙了. 首先想到用的是递归来实现, 但是怎么跳出这个循环呢? 我想了想,有人给了提示,可以使用与来判断: 先看代码: #include <stdio.h> int print(int num) { num && print(num-1); printf("%d ",num); return num; } int main

循环语句和条件语句

在程序中我们常见的.常写的就是循环语句和条件语句.也可以说我们的程序就是有很多的 循环语句和条件语句组成的. 循环语句中有for循环.while循环和do ...while循环.在上章中也说到了这三种语句都可以 改变流程的执行顺序.它们三者见得区别在于for循环和while循环都是先执行语句后去判断条件, 而do...while是先去判断条件再去执行语句. 条件语句中有if语句和switch语句,而在if语句中它又分为单分支语句(if(){}).双分支语 句(if(){}else{})和多分支语

SharePoint 2013 中使用 CAML 的Membership 条件

SharePoint 2013 中使用 CAML 的Membership条件. Membership 用判断用户是否属于某个组, 适用于SP组, AD组,AD组嵌套在SP组中的各种情况. 以下过滤条件表示过滤出当前用户属于AssignedTo这个字段的组(P组, AD组,AD组嵌套在SP组)的纪录: <Membership Type="CurrentUserGroups"> <FieldRef Name="AssginedTo"/> <

2015-09-29 第八节课(js语句:条件、循环)

1.条件语句: (1)比较操作符: ==:判断是否相等 !=:判断是否不相等 > :判断是否大于 >=:判断是否大于等于 < :判断是否小于 <=:判断是否小于等于 [例1] if(iNum1==iNum2) //如果iNum1与iNum2相等 { iNum3=iNum1; //将iNum1的值赋给iNum3 } else{  //否则 iNum3=iNum2;  //将iNum2的值赋给iNum3 } [补充]以上也可写作: iNum3 = iNum1==iNum2 ? iNum

2015.7.17 第八课 课程重点(js语句:条件、循环)

1.条件语句: (1)比较操作符: ==:判断是否相等 !=:判断是否不相等 > :判断是否大于 >=:判断是否大于等于 < :判断是否小于 <=:判断是否小于等于 [例1] if(iNum1==iNum2) //如果iNum1与iNum2相等 { iNum3=iNum1; //将iNum1的值赋给iNum3 } else{  //否则 iNum3=iNum2;  //将iNum2的值赋给iNum3 } [补充]以上也可写作: iNum3 = iNum1==iNum2 ? iNum

【2017-03-10】T-sql基础语句及条件,高级查询

一.T-sql基础语句 1.创建数据库:create database 数据库名  (不能中文,不能数字开头,不能符号开头) 2.删除数据库:drop database 数据库名 3.选择数据库:use 数据库名 4.创建表:create table 表名 ( 列名  数据类型, 列名  数据类型, 列名  数据类型 设置主键列:primary key 设置唯一列:unique 设置非空:not null 设置自增列:identity(1,1)   -从1开始计数,每次自增1 ) 5.删除表:d