В случаях, когда запрос CAML искажен, SharePoint, как правило, предоставляет вам представление списка по умолчанию вместо того, чтобы уважать ваш запрос. Похоже, это то, что здесь происходит. Если вы можете очистить свой запрос CAML, чтобы соответствовать ожиданиям SharePoint, он должен работать так, как вы хотите.
Во-первых, CAML чувствителен к регистру. Каждое имя тега в вашем CAML должно начинаться с заглавной буквы. Кроме того, встроенное поле идентификатора запрашивается со всеми заглавными буквами "ID"
вместо "Id"
.
Следует также отметить, что элемент FieldRef должен быть самозакрывающимся тегом (<FieldRef />
вместо <FieldRef></FieldRef>
).
Наконец, учтите, что если в вашем диапазоне более 500 значений, операция <Where><In>
завершится неудачей, как указано в в этом ответе . Если вы не ожидаете, что ваш запрос будет содержать диапазон 500 значений, вы можете игнорировать это ограничение.
После обновления вашего кода для учета вышеуказанного, он, вероятно, будет выглядеть примерно так:
var query = '<View><Query><Where>';
if(items.length < 500){
query += '<In><FieldRef Name="ID" /><Values>';
for (var i in items) {
query += '<Value Type="Counter">' + items[i].id + '</Value>';
}
query += '</Values></In>';
}else{
var orCounter = 0;
for(var i = 0, len = items.length; i < len; i++){
if(i % 500 == 0){
if(orCounter > 0){
query += '</Values></In>'
}
if(i+501 < items.length){
query += '<Or>';
orCounter++;
}
query += '<In><FieldRef Name="ID" /><Values>';
}
query += '<Value Type="Counter">' + items[i].id + '</Value>';
}
query += '</Values></In>';
for(var j = 0; j < orCounter; j++){
query+="</Or>";
}
}
query += '</Where></Query></View>';
Однако нам нужно посмотреть, как текст query
используется, чтобы определить, есть ли другие проблемы, которые могут повлиять на поведение запроса.