SPQuery – Какие поля (ViewFields) необходимы для обновления элемента списка?
-
10-12-2019 - |
Вопрос
Какие поля в SPQuery необходимы для обновления элемента списка?
SPQuery query = new SPQuery();
query.Query = @"
<OrderBy>
<FieldRef Name='ID' Ascending='true' />
</OrderBy>";
query.ViewFields = string.Concat(
"<FieldRef Name='ID' />",
"<FieldRef Name='Title' />");
query.ViewFieldsOnly = true;
query.RowLimit = 2000; // Effective batch size.
query.QueryThrottleMode = SPQueryThrottleOption.Override;
Если я побегу listItem.Update()
без изменения каких-либо полей обновление завершается с ошибкой 'value does not fall within the expected range'
.Но если я изменюсь ViewFieldsOnly
значение false, обновление пройдет успешно.Мой вопрос: какие поля необходимы для успешного обновления элемента списка (за исключением полей, которые могли быть изменены)?
Решение
AFAIK нигде не документировано, какие поля должны быть включены, чтобы иметь возможность выполнять обновление после запроса с ViewFieldOnly, для которого установлено значение true, но в соответствии с SPQuery.ViewFieldsOnly и обновление SPListItem это среди других идентификаторов, UniqueID, типа объекта...
НО я определенно рекомендую даже не пытаться, просто установите для ViewFieldsOnly значение false, и тогда вы будете уверены, что получите то, что необходимо, даже в будущих версиях SharePoint.
Другие советы
У меня тоже была эта проблема, и мне удалось ее обойти.Я включил идентификатор ListItem в ViewFields, а затем создал новую переменную SPListItem, используя List.GetItemByID.Затем вы можете выполнить обычное обновление элемента списка, используя эту новую переменную.
SPQuery q = new SPQuery();
q.Query = "Query here";
q.ViewFields = "...Fields Here...<FieldRef Name='ID' />";
q.ViewFieldsOnly = true;
foreach (SPListItem item in list.GetItems(q))
{
SPListItem i = list.GetItemById(int.Parse(item["ID"].ToString()));
//code to update item here
i.Update();
}
Возможно, это не лучшее решение, но оно помогло мне начать работу.