【问题标题】:CAML "NOT IN" queryCAML“不在”查询
【发布时间】:2012-07-20 13:30:29
【问题描述】:

有没有办法在 SharePoint 2010 中执行类似“不在”行为的操作?我可以轻松地实现这样的 IN 行为:

<Where>
   <In>
      <FieldRef Name="ID"/>
      <Values>
         <Value Type="Counter">1</Value>
         <Value Type="Counter">2</Value>
         <Value Type="Counter">3</Value>
         <Value Type="Counter">4</Value>
         <Value Type="Counter">5</Value>
      </Values>
   </In>
</Where>

但是有没有办法选择所有不在 Values 枚举中的值?

这是用例:我有一个 AllowMultipleValues = true 的 Lookup 字段,我需要从 LookupList 中获取所有项目,这些项目不包含在 Lookup 字段中

提前致谢!

【问题讨论】:

    标签: sharepoint caml


    【解决方案1】:

    从 SharePoint 2010 开始,NotIncludes 元素可能适合您。来自 MSDN:

    如果指定字段是允许多个值的查找字段,则指定从由 FieldRef 元素指定的字段的列表项中排除 Value 元素。

    模板:

    <NotIncludes>
        <FieldRef Name="Field_Name" />
        <Value Type="Field_Type" />
        <XML />
    </NotIncludes>
    

    【讨论】:

      【解决方案2】:

      要获得与“In”相反的行为,您必须进行嵌套的“Neq”查询。如果您正在处理具有多个值的查找字段,则“NotIncludes”可以替换或与“Neq”结合使用。

      <Query>
          <Where>
              <And>
                  <And>
                      <Neq>
                          <FieldRef Name="ID" /><Value Type="Counter">5</Value>
                      </Neq>
                      <Neq>
                          <FieldRef Name="ID" /><Value Type="Counter">13</Value>
                      </Neq>
                  </And>
                  <And>
                      <NotIncludes>
                          <FieldRef Name="children" /><Value Type="Lookup">20</Value>
                      </NotIncludes>
                      <NotIncludes>
                          <FieldRef Name="children" /><Value Type="Lookup">32</Value>
                      </NotIncludes>
                  </And>
              </And>
          </Where>
      </Query>
      

      如果您想要更多变量,则需要进行更多嵌套。玩得开心。

      【讨论】:

        【解决方案3】:

        我最接近的是使用&lt;NotIncludes&gt;&lt;/NotIncludes&gt;,但由于某种原因,它与&lt;In&gt;&lt;/In&gt; 的工作方式不同。在&lt;In&gt; 我可以使用&lt;Values&gt;。使用&lt;NotIncludes&gt;,您似乎只能指定一个值。其余的必须是&lt;Or&gt;,类似于&lt;Neq&gt;

        【讨论】:

          【解决方案4】:

          我认为不相等选项将是构建此 CAML 查询的最佳方式

          也许是这个(没有测试过,所以请耐心等待)

          <Query>
             <Where>
               <And>
                 <Neq>
                    <FieldRef Name="ID" /><Value Type="Counter">1</Value>
                 </Neq>
                 <Neq>
                    <FieldRef Name="ID" /><Value Type="Counter">2</Value>
                 </Neq>
                 <Neq>
                    <FieldRef Name="ID" /><Value Type="Counter">3</Value>
                 </Neq>
               </And>
             </Where>
          </Query>
          

          你应该看看可用的比较运算符

          • 包含
          • 开始于
          • 等式,等式
          • 不等于,不等于
          • Gt,大于
          • Lt,小于
          • Geq,大于或等于
          • Leq,小于或等于
          • DateRangesOverlap,将重复事件中的日期与指定的日期进行比较 价值
          • IsNotNull
          • 为空

          【讨论】:

          • 我不认为 CAML 是有效的 - 在 AND IIRC 下你不能有超过 2 个孩子。
          • 好的,我会进行一些测试,完成后返回结果!
          • 谢谢大家的回答,但是如果使用 运算符,当可能的变体数量超过 10 个(例如)时,查询会变得有点难看,顺便说一下,我目前已经使用 逻辑解决了这个问题,但我认为如果能够以某种方式实现 逻辑会很棒......
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-23
          • 2012-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-12
          • 1970-01-01
          相关资源
          最近更新 更多