Erro na minha webpart personalizada:A tentativa de operação é proibida porque excede o limite de exibição de lista imposto pelo administrador

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

  •  29-09-2020
  •  | 
  •  

Pergunta

Estou usando o sharepoint 2010.Eu criei uma webpart personalizada.Nesta webpart é possível adicionar um novo item.Antes de adicionar este novo item, preciso selecionar alguns valores nas caixas suspensas.No receptor de eventos da última caixa suspensa eu faço isso no código:

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();
                }
            }

Quando vou para a lista "Apparaat" vejo 5.002 itens.Quando cheguei às configurações da lista, vejo esta informação:

5.002 itens (o limite para esta visualização de lista é 5.000).

Quando recebi a lista "Apparaat" está tudo bem.Tento adicionar 2 itens e está funcionando bem.

Por que minha webpart personalizada está me fornecendo a exceção do limite de limite e a GUI está funcionando bem?

Foi útil?

Solução

Eu encontrei a solução sozinho.Eu criei um whileloop.Ele faz um loop neste loop while até que a contagem do total de itens seja atingida.Dentro do loop, pego os primeiros itens de 1999 e os adiciono a uma lista.Depois disso, pego os segundos itens de 1999.Ele fará essa lógica até atingir a contagem total de itens.Depois disso você terá uma lista com todos os itens e poderá adicioná-la ao repetidor.A razão pela qual usei itens de 1999 é porque é possível que o acelerador diminua de 5.000 para 2.000.O código personalizado também funcionará.

Outras dicas

Na função Reload, quando você chama ToList(), ele força o contexto de dados a emitir a consulta.Nesse ponto do seu código, você não especificou nenhum filtro (cláusula where), então todos os registros são lidos.(Bem, tentei ser lido.)

A propriedade DataSource pode aceitar uma fonte IQueryable, portanto, basta remover as chamadas ToList (alterar também o método ReloadFunctions) e você estará bem.

As consultas do Linq to SharePoint têm um limite de linha padrão de int máximo que é 2147483647 e aparentemente não pode ser alterado.Sua consulta provavelmente está retornando mais de 5.000 itens e excedendo os limites.

Para ter certeza de que não está excedendo o limite, você deve usar o objeto SPQuery e escrever sua consulta em CAML E DEFINIR A PROPRIEDADE ROWLIMIT PARA 5000.Você precisará de algo assim.Altere a consulta 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();

isso explica o que está acontecendo:

A tentativa de operação é proibida porque excede o limite de visualização da lista aplicado pelo administrador

é definido pelo administrador em uma lista da administração central no aplicativo da web!

Você pode ir administrador central -> gerenciamento de aplicativos -> gerenciar aplicativos da web -> selecione o aplicação web que contém a lista fornecida -> na guia acima, clique no suspenso para Configurações Gerais -> selecione limitação de recursos.

Isso deve fornecer uma caixa pop-up com as configurações do aplicativo da web definidas pelo administrador.se você rolar para baixo, você verá Limite de pesquisa da visualização de lista , por padrão, acho que está definido como 5000, você pode aumentar esse número para algo maior.

Encontro esse problema quando executo fluxos de trabalho na lista. Ele produz o mesmo erro, mas isso se deve a Limite de pesquisa da visualização de lista que é definido como 8 por padrão, você pode aumentar esse número para 100 e tenho quase certeza de que funcionará.

Eu entendo que algumas pessoas dizem que retornar todos os dados é errado, sim, isso é verdade até certo ponto...e se você precisar de tudo?e se você tiver mais de 1 milhão de registros?Eu sei que existem outras soluções, mas esta é uma delas e é fácil de corrigir nas configurações do administrador central e se o seu servidor puder lidar com a tensão, esta é uma opção simples.

Especifica o número máximo de itens de lista ou biblioteca que uma operação de banco de dados, como uma consulta, pode processar ao mesmo tempo.As operações que excedem esse limite são bloqueadas.

Para lhe dar tempo para fazer planos alternativos, o SharePoint 2010 adverte você na página Configurações da lista quando sua lista excedeu 3.000 itens.O aviso contém um link de ajuda para este tópico.

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

Este é o comportamento esperado - o SharePoint tem um recurso chamado 'Limitação de Consulta', que foi projetado para evitar que consultas de lista ineficientes afetem negativamente o desempenho dos usuários.

Este limite está definido para 5.000, e isso provavelmente deve não ser alterado.O motivo pelo qual está definido como 5.000 é que, em mais de 5.000 itens, o banco de dados SQL subjacente passa do bloqueio de linha para o bloqueio de tabela.Como o SharePoint armazena grande parte do seu conteúdo em uma tabela no banco de dados de conteúdo, isso pode ter um impacto significativo no desempenho do seu sistema e pode afetar muitos conjuntos de sites.

Agora, existem algumas maneiras de mitigar o Query Throttle.Em primeiro lugar, você pode usar índices de colunas na sua lista.Assim como consultar uma coluna de tabela SQL não indexada força uma varredura da tabela, consultar uma coluna de Lista não indexada faz o mesmo.Se essa lista contiver mais de 5.000 itens, bem, você acelerou.No entanto, uma coluna indexada significa que você pode recuperar apenas as linhas necessárias.

Se você precisar percorrer cada item em uma lista grande, há também o controle ContentIterator - no entanto, isso é lento, pois usa várias consultas para obter os itens relevantes, um de cada vez ou em lotes.

Recuperando itens um de cada vez:

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;
    }
 );

Recuperando itens em lotes:

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;
    }
);

Isso pode ajudar: http://www.novolocus.com/2012/07/09/dealing-with-large-lists-part-1-what-is-throttling-and-how-it-causes-difficulty/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top