Errore nella mia web part personalizzata:L'operazione tentata è vietata perché supera la soglia della visualizzazione elenco imposta dall'amministratore

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

  •  29-09-2020
  •  | 
  •  

Domanda

Sto usando SharePoint 2010.Ho creato una webpart personalizzata.In questa webpart è possibile aggiungere un nuovo elemento.Prima di aggiungere questo nuovo elemento, devo selezionare alcuni valori dalle caselle a discesa.Nel caso in cui il destinatario dell'ultimo dropdownbox lo faccio nel codice:

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 vado alla lista "Apparaat" vedo 5002 elementi.Quando sono arrivato alle impostazioni dell'elenco vedo queste informazioni:

5002 elementi (la soglia per questa visualizzazione elenco è 5000).

Quando ho ricevuto la lista "Apparaat" era tutto OK.Provo ad aggiungere 2 elementi e funziona correttamente.

Perché la mia web part personalizzata mi dà l'eccezione del limite di soglia e la GUI funziona correttamente?

È stato utile?

Soluzione

Ho trovato la soluzione da solo.Ho creato un whileloop.Loop loop in questo ciclo fino al raggiungimento del conteggio degli oggetti totali.All'interno del loop prendo i primi articoli del 1999 e lo aggiungo a una lista.Dopo questo prendo i secondi articoli del 1999.Farà questa logica fino a raggiungere il conteggio totale degli articoli.Dopo questo hai una lista con tutti gli articoli e può aggiungerlo al ripetitore.Il motivo per cui ho usato gli articoli del 1999 è perché è possibile che l'acceleratore può diminuire da 5000 a 2000. Il codice personalizzato funzionerà anche.

Altri suggerimenti

Nella funzione di ricarica, quando si chiama tolasist (), costringe il contesto dei dati di emettere la query.A quel punto nel codice, non hai specificato alcun filtro (dove la clausola), quindi tutti i record vengono letti.(Bene, ha tentato di essere letto.)

La proprietà DataSource può accettare una fonte iQueryable, quindi basta rimuovere le chiamate del tolasist (modificare pure il metodo di ricamoAdefunctions) e dovresti essere OK.

Le query di LINQ a SharePoint hanno un limite di riga predefinita di massimo INT che è 2147483647 e apparentemente non può essere modificato.La tua query è probabilmente restituita più di 5000 articoli e superando le soglie.

Per assicurarti di non superare la soglia, è necessario utilizzare l'oggetto spquote e scrivere la tua query in caml e impostare la proprietà RowLimit su 5000. Avrai bisogno di qualcosa del genere.Modificare la query 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();
.

questo spiega cosa sta succedendo:

Il tentativo di operazione è vietato perché supera la soglia di visualizzazione dell'elenco applicata dall'amministratore

è impostato dall'amministratore in un elenco dall'amministrazione centrale sull'applicazione web!

Puoi andare? amministratore centrale -> gestione delle applicazioni -> gestire applicazioni web -> Selezionare IL applicazione web che contiene l'elenco indicato -> all'interno della scheda in alto fare clic su cadere in picchiata per impostazioni generali -> seleziona limitazione delle risorse.

Questo dovrebbe darti una finestra popup con le impostazioni dell'applicazione web configurate dall'amministratore.se scorri verso il basso vedresti Soglia di ricerca visualizzazione elenco , per impostazione predefinita penso che sia impostato su 5000, puoi aumentare questo numero a qualcosa di più.

Riscontro questo problema quando eseguo flussi di lavoro nell'elenco, produce lo stesso errore ma ciò è dovuto a Soglia di ricerca visualizzazione elenco che è impostato su 8 per impostazione predefinita, puoi aumentare questo numero a 100 e sono quasi certo che funzionerà.

Capisco che alcune persone affermino che restituire tutti i dati sia sbagliato, sì, in qualche modo è vero...e se ti servisse tutto?cosa succede se hai più di 1 milione di record?So che ci sono altre soluzioni, ma questa è una ed è facile da correggere nelle impostazioni dell'amministratore centrale e se il tuo server è in grado di gestire lo sforzo, questa è un'opzione semplice.

Specifica il numero massimo di elenchi o elementi della libreria che un'operazione di database, come una query, può elaborare contemporaneamente.Le operazioni che superano questo limite sono bloccate.

Per darti il ​​tempo di fare piani alternativi, SharePoint 2010 ti avverte nella pagina delle impostazioni dell'elenco quando l'elenco ha superato i 3.000 articoli.L'avvertimento contiene un collegamento di aiuto a questo argomento.

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

Si prevede che il comportamento previsto - SharePoint ha una funzione chiamata "query throttling", progettata per prevenire le query di elenco inefficienti da influenzare negativamente le prestazioni per gli utenti.

Questo limite è impostato su 5000 e questo dovrebbe probabilmente non essere modificato. La ragione per cui è impostata su 5000 è che a più di 5000 elementi, il database SQL sottostante aumenta dal blocco della riga al blocco della tabella. Come SharePoint memorizza gran parte del contenuto in una tabella nel database dei contenuti, questo può avere un impatto significativo sulle prestazioni del tuo sistema, e questo può influenzare molte raccolte di siti.

Ora, ci sono alcuni modi per mitigare l'acceleratore della query. Innanzitutto, è possibile utilizzare gli indici delle colonne nell'elenco. Proprio come la query di una colonna tavola SQL non innessa costringe una scansione tabella, quindi la interrogazione di una colonna di elenco non insinuata non lo fa lo stesso. Se quell'elenco contiene più di 5000 articoli, beh, hai colpito l'acceleratore. Tuttavia, una colonna indicizzata significa che puoi semplicemente recuperare le righe che ti servono.

Se è necessario tornare a scavare attraverso ciascun elemento in un elenco di grandi dimensioni, è inoltre presente il controllo del controttento, tuttavia, questo è lento, in quanto utilizza più query per ottenere gli elementi pertinenti uno alla volta o in lotti.

Recupero degli articoli uno a-a-time:

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

Recupero di elementi in lotti:

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

Questo potrebbe aiutare: http://www.novolocus.com/2012/07/09/Dealing-with-large-lists-part-1-what-is-throttling-and-Come -IT-cause-difficoltà /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top