我正在尝试查询列表并获取与活动新闻通讯列表匹配的新闻通讯文章。
当尝试通过 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>
我已经确保它不是名称列中的参数(这意味着我在两个参数和三个参数实现中尝试了四月、五月和六月的所有可能组合)并且没有任何变化。我可以使用任何一组参数,并且两列总是有效,三列总是失败。
Help?
我也是经历了惨痛的教训才明白这一点的——CAML 分组<And>
and <Or>
只能成对工作 http://msdn.microsoft.com/en-us/library/ms196939.aspx来表达布尔逻辑。
聪明的一点(或者烦人,取决于你如何看待它)是分组本身也可以作为条件。所以在这种情况下,它看起来像这样:
<Or>
<Or>
<Condition1/>
<Condition2/>
</Or>
<Condition3/>
</Or>
在上面的例子中,我们说“要么这个表达式为真,要么条件3为真”;第一个表达式碰巧还有一个子表达式,该子表达式被计算并冒泡以表示单个布尔值。
如果您最终像我一样在应用程序中编写了大量复杂的查询,我强烈建议将其隐藏在 API 或 LINQ 等良好的对象模型后面,因为 XML 手动编写非常麻烦,而且很容易搞乱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)