Будет использование SPListItemCollection, возвращенного из функции, вновь открыли SPWeb?

Хотя объемные операции (например, пакет создают) важны во многих системах, они официально не обращены стилем Архитектуры RESTful.

я нашел, что, ОТПРАВЛЯЯ набор, поскольку Вы предложили в основном работы, но проблемы возникают, когда необходимо сообщить об отказах в ответ на такой запрос. Такие проблемы хуже, когда многократные отказы происходят по различным причинам или когда сервер не поддерживает транзакции. Мое предложение Вам - то, что, если нет никакой проблемы производительности, например, когда поставщик услуг находится на LAN (не WAN) или данные, является относительно маленьким, это стоит того для отправления 100 запросов POST к серверу. Сохраните его простым, запуститесь с отдельных запросов и если у Вас есть попытка производительности задач оптимизировать.

5
задан Community 23 May 2017 в 12:19
поделиться

3 ответа

Я узнал, напрямую спросив Стефана , что 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;
}
4
ответ дан 14 December 2019 в 19:20
поделиться

Если вы говорите о том, нужен ли вам SPWeb в той же области, когда вы приступаете к использованию SPListItemCollection, я думаю, что ответ отрицательный.

Например, я обычно делаю следующее:

    private IEnumerable<SPListItem> AllItems;

    public void GetItems()
    {
        var results = SPContext.Current.Web.Lists[ListName].Items.Cast<SPListItem>();
        this.AllItems = results;
    }

, а затем я использую AllItems повсюду, и он работает нормально.

Если вам интересно, приведение выполнено, поэтому я могу использовать Linq для набора результатов - намного быстрее, чем отправка запроса в список, особенно если вы выполняете несколько подзапросов данных.

0
ответ дан 14 December 2019 в 19:20
поделиться

Насколько я знаю, ответ отрицательный, но я бы написал код вроде

private void FetchItems(Action<SPListItemCollection> action)
{
   using(...)
   {
       var items = list.GetItems(query);
       action(items);
   }
}

. Сделав это, чтобы вызвать этот метод, вам нужно будет отправить метод (делегировать ), для которого следует использовать коллекцию SPListItemCollection, например:

FetchItems (items => ....) или FetchItems (DoStuffWithItems (SPListItemCollection))

1
ответ дан 14 December 2019 в 19:20
поделиться