Sharepoint CAML中OR运算符的问题

3
我将尝试查询一个列表,并获取与活动通讯列表匹配的新闻稿件。
但是,使用CAML查询时会遇到问题。如果我使用两个CONTAINS的OR循环,它可以正常工作。例如:
<Where>
  <Or>
    <Contains>
      <FieldRef Name=\"Newsletter_x0020_Name\"/>
      <Value Type=\"Lookup\">April 2012</Value>
    </Contains>
    <Contains>
      <FieldRef Name=\"Newsletter_x0020_Name\"/>
      <Value Type=\"Lookup\">May 2012</Value>
    </Contains>
  </Or>
</Where>

工作得非常好!

如果添加第三行,我们就会遇到问题:

<Where>
  <Or>
    <Contains>
      <FieldRef Name=\"Newsletter_x0020_Name\"/>
      <Value Type=\"Lookup\">April 2012</Value>
    </Contains>
    <Contains>
      <FieldRef Name=\"Newsletter_x0020_Name\"/>
      <Value Type=\"Lookup\">May 2012</Value>
    </Contains>
    <Contains>
      <FieldRef Name=\"Newsletter_x0020_Name\"/>
      <Value Type=\"Lookup\">June 2012</Value>
    </Contains>
  </Or>
</Where>

我已经确保不是名称列内的参数问题(也就是说,在两个参数和三个参数实现中,我尝试了四月、五月和六月的所有可能组合),但仍然没有变化。我可以使用任何一组参数,两列总是正常工作,而三列总是失败。

有什么帮助吗?

1个回答

4
我也曾经吃过这个亏——CAML分组<And><Or>只能成对使用来表达布尔逻辑。
聪明的部分(或者烦人的部分,取决于你怎么看)是这些分组也可以作为条件本身使用。因此,在这种情况下,它应该像这样:
<Or>
    <Or>
        <Condition1/>
        <Condition2/>
    </Or>
    <Condition3/>
</Or>

在上述情况中,我们说“这个表达式是真的,或者Condition3是真的”;第一个表达式恰好还有一个子表达式,该子表达式被评估并向上冒泡以表示一个布尔值。
如果您像我一样在应用程序中编写了很多复杂的查询,我强烈建议将其隐藏在API或像LINQ这样的漂亮对象模型后面,因为手动编写XML非常麻烦,容易出错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接