我正在尝试查询列表并获取与活动时事通讯列表相匹配的简报文章。
尝试通过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月的每种组合)并且没有任何变化。我可以使用任何参数集,并且两列始终有效,并且三列始终失败。
帮助?
答案 0 :(得分:4)
我也很难理解这一点 - CAML分组<And>
和<Or>
only work in pairs 来表达布尔逻辑。
聪明的一点(或者令人讨厌,取决于你如何看待它)是分组本身也起着条件的作用。所以在这种情况下,它看起来像这样:
<Or>
<Or>
<Condition1/>
<Condition2/>
</Or>
<Condition3/>
</Or>
在上面的例子中,我们说“这个表达式是真的,或者Condition3是真的”;第一个表达式恰好也有一个子表达式,它被计算并冒泡以表示一个布尔值。
如果您最终在我的应用程序中编写了大量复杂查询,我强烈建议将其隐藏在API或LINQ之类的漂亮对象模型之后,因为XML手工编写非常麻烦,而且易于编写搞砸了。