Sharepoint CAML中的OR问题

时间:2012-03-16 00:45:10

标签: c# linq sharepoint caml

我正在尝试查询列表并获取与活动时事通讯列表相匹配的简报文章。

尝试通过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>

我已经确定它不是名称列中的参数(意思是我已尝试了两个参数和三个参数实现中4月,5月和6月的每种组合)并且没有任何变化。我可以使用任何参数集,并且两列始终有效,并且三列始终失败。

帮助?

1 个答案:

答案 0 :(得分:4)

我也很难理解这一点 - CAML分组<And><Or> only work in pairs 来表达布尔逻辑。

聪明的一点(或者令人讨厌,取决于你如何看待它)是分组本身也起着条件的作用。所以在这种情况下,它看起来像这样:

<Or>
    <Or>
        <Condition1/>
        <Condition2/>
    </Or>
    <Condition3/>
</Or>

在上面的例子中,我们说“这个表达式是真的,或者Condition3是真的”;第一个表达式恰好也有一个子表达式,它被计算并冒泡以表示一个布尔值。

如果您最终在我的应用程序中编写了大量复杂查询,我强烈建议将其隐藏在API或LINQ之类的漂亮对象模型之后,因为XML手工编写非常麻烦,而且易于编写搞砸了。