Запрос CAML для нескольких ветвей операторов И-ИЛИ-В

Я использую CAML Query для извлечения элементов из списка.

Я попытался перестроить структуру моего запроса и все равно ничего не вернул. Я стараюсь не использовать 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 Query кажется особенным в том, где вы размещаете свои закрывающие теги.

Я неправильно вложил свои «И» и «Или»? Что может быть не так/отсутствует в этом запросе?


person Marlo C    schedule 23.06.2014    source источник
comment
Ваш запрос неверен: каждый оператор сравнения (например, содержит) должен содержать два других узла - 1) ‹FieldRef Name='FieldName' /›, который содержит имя поля, и ‹Value Type='type'›somevalue‹/Value›, который содержит значение для сравнения. msdn.microsoft.com/en- мы/библиотека/офис/   -  person Yevgeniy.Chernobrivets    schedule 23.06.2014
comment
ОП, мы предполагаем, что вы для краткости пропустили элементы <FieldRef> и <Value> — обновите вопрос, указав полный CAML.   -  person Stevangelista    schedule 24.06.2014
comment
@Stevangelista Да, я поставил A, B, C, D вместо этих элементов. Я сделал это для простоты, поскольку моя проблема, похоже, связана со структурой его родительских узлов.   -  person Marlo C    schedule 24.06.2014
comment
@Yevgeniy.Cernobrivets не может иметь ‹Contains› только 1, как может ‹Eq›? Например: ‹Where›‹Eq›‹FieldRef.../›‹Value›‹/Value›‹/Eq›‹/Where›   -  person Marlo C    schedule 24.06.2014
comment
Я полагаю, что Евгений имел в виду, что <Contains> нужны два дочерних элемента; один <FieldRef> и один <Value> - не два каждого.   -  person Stevangelista    schedule 24.06.2014
comment
По моему опыту, если запрос CAML имеет неверный формат, запрос возвращает все элементы из списка. Вы сказали, что ваш запрос не возвращает никаких элементов, поэтому я подозреваю, что ни один элемент не соответствует условиям. Трудно что-то сказать об этой ситуации без какого-либо предметного примера.   -  person Yevgeniy.Chernobrivets    schedule 24.06.2014


Ответы (1)


Хотя ваш CAML кажется мне действительным (без фактических элементов <FieldRef> и <Value> я не могу специально проверить ваши имена полей, типы и значения), я склонен писать свой CAML более «сбалансированным» способом, как таковой:

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

Согласно спецификации, и ваша опубликованная версия, и мой ответ здесь дадут один и тот же результат, но я бы проверил, чтобы подтвердить. Если вышеперечисленное не работает, краткость в стороне, я бы предложил опубликовать ваш полный CAML, чтобы мы могли воссоздать ваш список с теми же именами и типами полей и тестовыми данными с соответствующими значениями.

person Stevangelista    schedule 24.06.2014
comment
Отредактировано. Я просто не хотел раскрывать имена полей и значения поиска. - person Marlo C; 24.06.2014
comment
Я могу оценить необходимость очистки данных, но если ваш CAML действительно выглядит так, эти <In> условия неверны. Оператор <In> имеет дочерний элемент <Values>, который сам имеет n количество элементов <Value›. Кроме того, поскольку оператор <In> предназначен для упрощения написания нескольких условий <Eq> внутри ветки <Or>, его не следует использовать только для одного условия. - person Stevangelista; 24.06.2014
comment
спасибо, что поймал это! На самом деле я использую <Values> для своего <In>, но забыл поместить их сюда. Это все еще не работает. - person Marlo C; 24.06.2014
comment
Тогда, как также прокомментировал Евгений, без реальных имен столбцов, типов данных, значений фильтров и элементов выборки дальнейшее тестирование будет невозможно. Мой ответ и ваш CAML соответствуют спецификации CAML, но чтобы получить ответ о том, почему он не работает в вашем конкретном случае использования, потребуется дополнительная информация. - person Stevangelista; 24.06.2014