• 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>
     
    <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>

    <Or>
     
    <Eq><FieldRef Name=”Title”><Value Type=”Text”>Value</Value></Eq>
     
    <Eq><FieldRef Name=”ContentType”><Value Type=”Text”>Product</Value></Eq>
     
    <Eq><FieldRef Name=”Field1”><Value Type=”Text”>Value</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();

    OK,搞定;

  • 相关阅读:
    Java日期工具类,Java时间工具类,Java时间格式化
    js 小数取整,js 小数向上取整,js小数向下取整
    Tomcat v7.0 Server at localhost are already in use,tomcat提示端口被占用,tomcat端口已经被使用,tomcat端口占用
    easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大
    Jquery Easyui验证扩展,Easyui验证,Easyui校验,js正则表达式
    根据日期字符串获取星期几,日期获取星期,时间获取星期,js获取星期
    jquery easyui combobox 级联及触发事件,combobox级联
    js计算2个日期相差的天数,两个日期相差的天数,日期相隔天数
    设置checkbox选中,设置radio选中,根据值设置checkbox选中,checkbox勾选
    layer弹出层不居中解决方案,layer提示不屏幕居中解决方法,layer弹窗不居中解决方案
  • 原文地址:https://www.cnblogs.com/KingStar/p/1914050.html
Copyright © 2020-2023  润新知