Ошибка в моей пользовательской веб-части:Попытка операции запрещена, поскольку она превышает пороговое значение просмотра списка, установленное администратором.

sharepoint.stackexchange https://sharepoint.stackexchange.com/questions/105553

  •  29-09-2020
  •  | 
  •  

Вопрос

Я использую SharePoint 2010.Я создал собственную веб-часть.В этой веб-части можно добавить новый элемент.Прежде чем добавить этот новый элемент, мне нужно выбрать некоторые значения из раскрывающихся списков.В приемнике событий последнего раскрывающегося списка я делаю это в коде:

protected void ddProcesses_SelectedIndexChanged(object sender, EventArgs e)
        {
            btnAddFunction.Visible = true;

//            alApparaten.Visible = false;

            ReloadFunctions();

            ((ApparaatList)alApparaten).FuncID = 0;
            ((ApparaatList)alApparaten).Reload();
        }


public void Reload()
        {
            using (AssetRegisterDataContext spContext = new AssetRegisterDataContext(SPContext.Current.Site.Url))
            {
                var apparaten = from i in spContext.Apparaat.ToList()
                                where i.Functie_ID != null && i.Functie_ID.Id == FuncID
                                select i;
                rptApparaten.DataSource = (from i in apparaten where i.Verwijderd != true select i);
                rptApparaten.DataBind();
            }

        }


    private void ReloadFunctions()
            {
                using (AssetRegisterDataContext spContext = new AssetRegisterDataContext(SPContext.Current.Site.Url))
                {
                    var query = (from i in spContext.Functies.ToList()
                                 where (i.Locatie != null && i.Locatie.LocatieNaamCode == ddLocations.SelectedValue)
                                    && (i.Faciliteitnaam != null && i.Faciliteitnaam.Faciliteitnaam == ddFacilities.SelectedValue)
                                    && (i.Procesnaam != null && i.Procesnaam.Procesnaam == ddProcesses.SelectedValue)
                                    && (i.Verwijderd != true)
                                 select i
                                 );
                    rptFunctions.DataSource = query;
                    rptFunctions.DataBind();
                }
            }

Когда я захожу в список «Аппарат», я вижу там 5002 позиции.Когда я добрался до настроек списка, я увидел эту информацию:

5002 элемента (пороговое значение для этого представления списка — 5000).

Когда получил список "Аппарат" все ок.Я пытаюсь добавить 2 элемента, и все работает нормально.

Почему моя пользовательская веб-часть выдает мне исключение порогового значения, а графический интерфейс работает нормально?

Это было полезно?

Решение

Я нашел решение сам.Я создал цикл while.Он зацикливается в этом цикле while до тех пор, пока не будет достигнуто общее количество элементов.Внутри цикла я беру первые элементы 1999 года и добавляю их в список.После этого беру вторые предметы 1999 года.Он будет выполнять эту логику до тех пор, пока вы не достигнете общего количества элементов.После этого у вас есть список со всеми элементами и вы можете добавить его в репитер.Причина, по которой я использовал изделия 1999 года, заключается в том, что газ можно уменьшить с 5000 до 2000.Пользовательский код также будет работать.

Другие советы

В функции Reload, когда вы вызываете ToList(), контекст данных выдает запрос.В этот момент вашего кода вы не указали никаких фильтров (предложениеwhere), поэтому считываются все записи.(Ну, попыталась прочитать.)

Свойство DataSource может принимать источник IQueryable, поэтому просто удалите вызовы ToList (также измените метод ReloadFunctions), и все будет в порядке.

Запросы Linq to SharePoint имеют максимальное ограничение строк по умолчанию, равное 2147483647, и, очевидно, не могут быть изменены.Вероятно, ваш запрос возвращает более 5000 элементов и превышает пороговые значения.

Чтобы убедиться, что вы не превышаете пороговое значение, вам необходимо использовать объект SPQuery, написать запрос в CAML И УСТАНОВИТЬ ДЛЯ СВОЙСТВА ROWLIMIT значение 5000.Вам понадобится что-то вроде этого.Измените запрос CAML.

SPQuery q=new SPQuery();
q.Query="<Where><IsNotNull><FieldRef Name='Functie_ID' /></IsNotNull></Where>";
q.RowLimit=5000;
SPListItemCollection resultItems=ApparaatList.GetItems(q);
rptApparaten.DataSource =resultItems;
rptApparaten.DataBind();

это объясняет, что происходит:

Попытка операции запрещены, поскольку она превышает порог просмотра списка, соблюдаемый администратором

он установлен администратором в списке центра администрирования веб-приложения!

Ты можешь пойти центральный администратор -> управление приложениями -> управлять веб-приложениями -> выбирать тот веб приложение который содержит данный список -> на вкладке выше нажмите на значок падать для общие настройки -> выбрать регулирование ресурсов.

Это должно открыть всплывающее окно с настройками веб-приложения, установленными администратором.если вы прокрутите вниз, вы увидите Порог поиска в представлении списка Я думаю, что по умолчанию установлено значение 5000, вы можете увеличить это число до чего-то большего.

Я сталкиваюсь с этой проблемой, когда у меня есть рабочие процессы в списке, возникает та же ошибка, но это связано с Порог поиска в представлении списка по умолчанию установлено значение 8, вы можете увеличить это число до 100, и я почти уверен, что это будет работать.

Я понимаю, что некоторые люди говорят, что возвращать все данные неправильно, да, в некоторой степени это правда...а что, если тебе нужно все это?что, если у вас более 1 миллиона записей?Я знаю, что есть и другие решения, но это одно, и его легко исправить в настройках центрального администратора, и если ваш сервер может справиться с нагрузкой, то это простой вариант.

Определяет максимальное количество элементов списка или библиотеки, которые операция базы данных, такие как запрос, может обрабатывать за один раз.Операции, превышающие этот предел, заблокированы.

Чтобы дать вам время для составления альтернативных планов, SharePoint 2010 предупреждает вас на странице «Настройки списка», когда ваш список превышает 3000 пунктов.Предупреждение содержит справочную ссылку на эту тему.

http://office2010.microsoft.com/en-us/sharepoint-server-help/manage-lists-and-libraries-with-many-items-HA010378155.aspx?redir=0

Это ожидаемое поведение — в SharePoint есть функция «Регулирование запросов», которая предназначена для предотвращения негативного влияния неэффективных запросов к спискам на производительность пользователей.

Этот предел установлен на 5000, и это, вероятно, должно нет быть изменен.Причина, по которой для него установлено значение 5000, заключается в том, что при наличии более 5000 элементов базовая база данных SQL переходит от блокировки строк к блокировке таблиц.Поскольку SharePoint хранит большую часть своего контента в одной таблице базы данных контента, это может оказать существенное влияние на производительность вашей системы и повлиять на многие семейства веб-сайтов.

Теперь есть несколько способов смягчить ограничение запросов.Во-первых, вы можете использовать индексы столбцов в своем списке.Точно так же, как запрос к неиндексированному столбцу таблицы SQL требует сканирования таблицы, запрос к неиндексированному столбцу списка делает то же самое.Если этот список содержит более 5000 элементов, что ж, вы нажимаете на газ.Однако индексированный столбец означает, что вы можете просто получить нужные строки.

Если вам нужно просмотреть каждый элемент в большом списке, существует также элемент управления ContentIterator, однако он работает медленно, поскольку использует несколько запросов для получения соответствующих элементов по одному или в пакетах.

Получение элементов по одному:

ContentIterator ci = new ContentIterator("Single Item Example);
SPQuery qry = new SPQuery();
qry.Query = "<Where><Eq><FieldRef Name='Colour'/><Value Type='Text'>Pink</Value></Eq></Where>";
qry.Query = qry.Query + ContentIterator.ItemEnumerationOrderByNVPField;
ci.ProcessListItems(list, qry,
    delegate(SPListItem item)
    {
         // Do stuff with the item
    },
    delegate(SPListItem item, Exception ex)
    {
      // Handle an exception. Return TRUE to rethrow the exception, FALSE to keep iterating  return false;
    }
 );

Получение элементов в пакетном режиме:

ContentIterator ci = new ContentIterator("Batch Example);
SPQuery qry = new SPQuery();
qry.Query = "<Where><Eq><FieldRef Name='Colour'/><Value Type='Text'>Pink</Value></Eq></Where>";
qry.Query = qry.Query + ContentIterator.ItemEnumerationOrderByNVPField;
ci.ProcessListItems(list, qry,
    delegate(SPListItemCollection items)
    {
        foreach (SPListItem itm in items)
        {
            //Process each item in batch!
        }
    },
    delegate(SPListItemCollection item, Exception ex)
    {
         // Handle an exception. Return TRUE to rethrow the exception, FALSE to keep iterating  return false;
    }
);

Это может помочь: http://www.novolocus.com/2012/07/09/dealing-with-large-lists-part-1-what-is-throttling-and-how-it-causes-difficulty/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top