#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, но чтобы получить ответ о том, почему он не работает в вашем конкретном случае использования, потребуется более подробная информация.