Хотя объемные операции (например, пакет создают) важны во многих системах, они официально не обращены стилем Архитектуры RESTful.
я нашел, что, ОТПРАВЛЯЯ набор, поскольку Вы предложили в основном работы, но проблемы возникают, когда необходимо сообщить об отказах в ответ на такой запрос. Такие проблемы хуже, когда многократные отказы происходят по различным причинам или когда сервер не поддерживает транзакции. Мое предложение Вам - то, что, если нет никакой проблемы производительности, например, когда поставщик услуг находится на LAN (не WAN) или данные, является относительно маленьким, это стоит того для отправления 100 запросов POST к серверу. Сохраните его простым, запуститесь с отдельных запросов и если у Вас есть попытка производительности задач оптимизировать.
Я узнал, напрямую спросив Стефана , что SPListItemCollection действительно может повторно открыть SPWeb после того, как вы избавитесь от него. Это означает, что мой код, опубликованный выше, НЕПРАВИЛЬНЫЙ, и я смогу удалить SPWeb только после того, как использую SPListItemCollection.
Обновление: лучше преобразовать SPListItemCollection во что-то другое и вместо этого вернуть его.
private DataTable GetListItems()
{
DataTable table = null;
try
{
SPListItemCollection items = null;
using (SPSite site = new SPSite(GetListSiteUrl()))
{
using (SPWeb web = site.OpenWeb())
{
// retrieve the list
SPList list = web.Lists[_ListName];
// more code to create the query...
items = list.GetItems(query);
// convert to a regular DataTable
table = items.GetDataTable();
}
}
}
catch (Exception e)
{
// log error
}
return table;
}
Если вы говорите о том, нужен ли вам SPWeb в той же области, когда вы приступаете к использованию SPListItemCollection, я думаю, что ответ отрицательный.
Например, я обычно делаю следующее:
private IEnumerable<SPListItem> AllItems;
public void GetItems()
{
var results = SPContext.Current.Web.Lists[ListName].Items.Cast<SPListItem>();
this.AllItems = results;
}
, а затем я использую AllItems повсюду, и он работает нормально.
Если вам интересно, приведение выполнено, поэтому я могу использовать Linq для набора результатов - намного быстрее, чем отправка запроса в список, особенно если вы выполняете несколько подзапросов данных.
Насколько я знаю, ответ отрицательный, но я бы написал код вроде
private void FetchItems(Action<SPListItemCollection> action)
{
using(...)
{
var items = list.GetItems(query);
action(items);
}
}
. Сделав это, чтобы вызвать этот метод, вам нужно будет отправить метод (делегировать ), для которого следует использовать коллекцию SPListItemCollection, например:
FetchItems (items => ....) или FetchItems (DoStuffWithItems (SPListItemCollection))