我之前有一个问题(已经解决了),为什么我被限制在CAML中的两个参数。
供参考:Trouble with OR in Sharepoint CAML
我现在想知道的是,我可以重新格式化这个CAML查询以接受5个OR参数,其中我从列表中收集所有项目,我找到了5个参数中的任何一个的匹配。
我问的原因是,我仅限于使用Sandbox解决方案Web部件的Designer部署。这些解决方案的资源非常有限,我希望尽可能提高查询效率,而且大多数LINQ解决方案都不像CAML那样有效地改变SQL调用。
答案 0 :(得分:5)
是。 OR
没有设定限制。 (由于CAML如何转换为SQL,最大深度约为2000个链式运算符,但这可以通过平衡查询树来增加。)
保持嵌套 OR
的所需组合。我建议使用XNode / XElement和递归来创建一个“神奇地”执行此操作的函数。
请注意,嵌套非常简单(我用S-expression形式编写,也是前缀以显示发生的情况,以及中缀 C#条件等效):
1: (OR a b) => a || b => a || b
2: (OR (OR a b) c) => (a || b) || c => a || b || c
3: (OR (OR (OR a b) c) d) => ((a || b) || c) || d => a || b || c || d
请注意,每个新OR
只是“包装”前一个表达式。
性能基于底层SQL Server数据库的性能,并根据CAML中使用的字段而有所不同。如果该字段是索引的一部分,那么对于“等于”或“范围”条件,操作非常快。即使列不是索引的一部分,对于“小”的列表,它仍然是一个非常快速的操作。
最好的办法是使用像U2U CAML Query Builder ("Windows Version")这样的工具“试试”,看看有什么性能问题,如果有的话。
快乐的编码。