Запрос CAML для нескольких ветвей операторов «And-Or-In»

#sharepoint #sharepoint-2010 #caml

#sharepoint #sharepoint-2010 #caml

Вопрос:

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

Я попытался перестроить структуру своего запроса, но все равно ничего не вернул. Я стараюсь не использовать конструктор CamlQuery (делая это вручную).

 <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, похоже, особенно важен в том, где вы размещаете свои закрывающие теги.

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

Комментарии:

1. Ваш запрос неверен: каждый оператор сравнения (например, Contains) должен содержать два других узла — 1) <FieldRef Name=’FieldName’ />, который содержит имя поля и <Тип значения=’type’>somevalue</Value>, который содержит значение для сравнения. msdn.microsoft.com/en-us/library/office /…

2. ОП, мы предполагаем, что вы опустили элементы <FieldRef> и <Value> для краткости — пожалуйста, обновите вопрос полным CAML.

3. @Stevangelista Да, я поставил «A, B, C, D» вместо этих элементов. Я сделал это для простоты, поскольку моя проблема, похоже, исходит из структуры его родительских узлов.

4. @Евгений. Чернобривец не может <Contains> иметь только 1, точно так же, как <Eq> может? Например: <Where><Eq><FieldRef …/><Значение></Значение></Eq></Where>

5. Я полагаю, что Евгений имел в виду, что <Contains> требуется два дочерних элемента; один <FieldRef> и один <Value> — не по два для каждого.

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

Комментарии:

1. Отредактировано. Я просто не хотел раскрывать имена своих полей и значения поиска.

2. Я могу оценить необходимость очистки данных, но если это действительно то, как выглядит ваш CAML, эти <In> условия неверны. У <In> оператора есть дочерний <Values> элемент, который сам имеет n количество элементов <Value . Кроме того, поскольку <In> оператор предназначен для упрощения записи нескольких <Eq> условий внутри <Or> ветви, вы не должны использовать его только для одного условия.

3. спасибо, что поняли это! Я на самом деле использую <Values> для своего <In> , но забыл поместить их здесь. Он все еще не работает.

4. Тогда, как также прокомментировал Евгений, без реальных имен столбцов, типов данных, значений фильтров и элементов выборки дальнейшее тестирование будет невозможно. Мой ответ и ваш CAML действительны для спецификации CAML, но чтобы получить ответ о том, почему он не работает в вашем конкретном случае использования, потребуется более подробная информация.