【问题标题】:CAML Query for multiple branches of "And-Or-In" statements“And-Or-In”语句的多个分支的 CAML 查询
【发布时间】:2014-06-24 23:51:17
【问题描述】:

我正在使用 CAML 查询从列表中提取项目。

我尝试重新安排查询的结构,但仍然没有返回任何内容。我尽量不使用 CAMLQuery Builder(手动操作)。

<Query>
    <Where>
        <And>
            <Contains>
                <FieldRef Name="Field1"/><Value Type="Text">A</Value>
            </Contains>
            <And>
                <In>
                    <FieldRef Name="Field2"/><Values><Value Type="Text">B</Value></Values>
                </In>
                <Or>
                    <In>
                        <FieldRef Name="Field3"/><Values><Value Type="Text">C</Value></Values>
                    </In>
                    <In>
                        <FieldRef Name="Field4"/><Values><Value Type="Text">D</Value></Values>
                    </In>
                </Or>
            </And>
        </And>
    </Where>
</Query>

注意:我看到的问题可能看起来与此重复,但从未见过像这种分支级别那样深入的问题。 CAML 查询似乎特别关注您放置结束标签的位置。

我是否错误地嵌套了“与”和“或”?此查询中可能有什么错误/遗漏?

【问题讨论】:

  • 您的查询不正确:每个比较运算符(例如 Contains)应包含另外两个节点 - 1) 包含字段名称和 somevalue 包含要比较的值。 msdn.microsoft.com/en-us/library/office/…
  • OP,为简洁起见,我们假设您省略了 &lt;FieldRef&gt;&lt;Value&gt; 元素 - 请使用完整的 CAML 更新问题。
  • @Stevangelista 是的,我用“A、B、C、D”代替了这些元素。我这样做是为了简单起见,因为我的问题似乎来自其父节点的结构。
  • @Yevgeniy.Chernobrivets 不能像 一样只有 1 个吗?例如:
  • 我相信 Yevgeniy 的意思是 &lt;Contains&gt; 需要两个子元素;一个&lt;FieldRef&gt; 和一个&lt;Value&gt; - 不是两个。

标签: sharepoint sharepoint-2010 caml


【解决方案1】:

虽然您的 CAML 对我来说似乎有效(没有实际的 &lt;FieldRef&gt;&lt;Value&gt; 元素,我无法专门测试您的字段名称、类型和值),但我倾向于以更“平衡”的方式编写我的 CAML ,因此:

<Query>
    <Where>
        <And>
            <And>
                <Contains>A</Contains>
                <In>B</In>
            </And>
            <Or>
                <In>C</In>
                <In>D</In>
            </Or>
        </And>
    </Where>
</Query>

根据规范,您发布的版本和我在此处的回答都会得到相同的结果,但我会进行测试以确认。如果上述方法不起作用,我建议您发布完整的 CAML,以便我们可以使用相同的字段名称和类型重新创建您的列表,并使用匹配的值测试数据。

【讨论】:

  • 已编辑。我只是不想透露我的字段名称和搜索值。
  • 我可以理解需要清理数据,但如果这真的是您的 CAML 的样子,那么那些 &lt;In&gt; 条件是不正确的。 &lt;In&gt; 运算符有一个子 &lt;Values&gt; 元素,它本身有 n 数量的 &lt;Value> 元素。此外,由于 &lt;In&gt; 运算符旨在简化在 &lt;Or&gt; 分支中编写多个 &lt;Eq&gt; 条件的过程,因此不应仅将其用于单个条件。
  • 感谢您的收看!我实际上正在为我的&lt;In&gt; 使用&lt;Values&gt;,但忘了把它们放在这里。它仍然无法正常工作。
  • 那么正如 Yevgeniy 还评论的那样,没有真实的列名、数据类型、过滤器值和示例项,将无法进一步测试。我的回答和您的 CAML 都对 CAML 规范有效,但要了解为什么它在您的特定用例中不起作用,需要更多详细信息。
猜你喜欢
  • 1970-01-01
  • 2020-01-06
  • 2011-09-06
  • 2014-09-13
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2014-09-01
相关资源
最近更新 更多