Erreur dans mon webpart personnalisé: la tentative d'opération est interdite car elle dépasse le seuil de vue de la liste appliquée par l'administrateur

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

  •  29-09-2020
  •  | 
  •  

Question

J'utilise SharePoint 2010. J'ai créé un webpart personnalisé.Dans ce Webpart, il est possible d'ajouter un nouvel élément.Avant d'ajouter ce nouvel élément, j'ai besoin de sélectionner des valeurs dans des zones déroulantes.Dans le récepteur de l'événement de la dernière Dropdownbox, je le fais en code:

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

Quand je vais à la liste "Apparapaat", je vois là 5002 articles.Quand je suis arrivé aux paramètres de la liste, je vois cette information:

5002 éléments (le threhold pour cette vue de la liste est 5000).

Quand j'ai eu la liste "Apparaat" Tout va bien.J'essaie d'ajouter 2 articles et travaille ok.

Pourquoi mon WebPart personnalisé me donne la limite de thresold extrémité et l'interface graphique fonctionne bien?

Était-ce utile?

La solution

J'ai trouvé la solution par moi-même.J'ai créé un whileloop.Il boucle dans cette boucle jusqu'à ce que le nombre total d'articles soit atteint.À l'intérieur de la boucle, je prends les premiers articles de 1999 et l'ajoutez à une liste.Après cela, je prends les deuxième articles de 1999.Cela fera cette logique jusqu'à atteindre le nombre total d'articles.Après cela, vous avez une liste avec tous les articles et pouvez l'ajouter au répéteur.La raison pour laquelle j'ai utilisé des éléments de 1999 est que cela est possible que l'accélérateur puisse diminuer de 5000 à 2000. Le code personnalisé fonctionnera également.

Autres conseils

Dans la fonction de recharge, lorsque vous appelez Tolist (), il oblige le contexte de données à émettre la requête.À ce moment-là de votre code, vous n'avez pas spécifié de filtres (où la clause), de sorte que tous les enregistrements sont lus.(Bien, tenté d'être lu.)

La propriété DataSource peut accepter une source iquérirable, alors supprimez simplement les appels tolistes (modifiez également la méthode de la reloadfunctions) et vous devriez être correct.

LINQ to SharePoint Les requêtes ont une limite de ligne par défaut de maximum int qui est 2147483647 et ne peut apparemment pas être modifiée.Votre requête retourne probablement plus de 5000 articles et dépassant les seuils.

Pour vous assurer de ne pas dépasser le seuil, vous devez utiliser un objet SPQUERY et écrire votre requête dans CAML et définir la propriété Rowlimit sur 5000. Vous aurez besoin de quelque chose comme ça.Changer la requête 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();

Ceci explique ce qui se passe:

La tentative d'opération est interdite car elle dépasse la vue de la liste. Seuil imposé par l'administrateur

Son défini par l'administrateur sur une liste d'une administration centrale sur l'application Web!

pouvez-vous goto admin central -> Dégustion des applications -> gérer les applications Web -> Sélectionnez le Le < Strong> Application Web qui détient la liste donnée -> Dans l'onglet Au-dessus de cliquer sur la liste DISPOSEZ pour Paramètres généraux -> Sélectionnez

Ceci est attendu Comportement - SharePoint a une fonctionnalité appelée «Demande de la requête», qui est conçue pour empêcher les requêtes de la liste inefficaces d'affecter négativement les performances des utilisateurs.

Cette limite est définie sur 5000, ce qui devrait probablement pas être changé. La raison pour laquelle il est défini sur 5000 est que, à plus de 5000 articles, la base de données SQL sous-jacente augmente du verrouillage de la ligne au verrouillage de la table. Comme SharePoint stocke une grande partie de son contenu dans une table dans la base de données de contenu, cela peut avoir un impact significatif sur les performances de votre système, ce qui peut affecter de nombreuses collections de sites.

Maintenant, il existe des moyens d'atténuer l'accélérateur de la requête. Premièrement, vous pouvez utiliser des index de colonne sur votre liste. Tout comme interroger une colonne de table SQL non indexée, oblige une numérisation de table, une interrogation de la colonne de liste non annoncée fait de même. Si cette liste contient plus de 5000 articles, eh bien, vous avez frappé la manette des gaz. Cependant, une colonne indexée signifie que vous pouvez simplement récupérer les lignes dont vous avez besoin.

Si vous avez besoin de pêcher à travers chaque élément dans une liste importante, il existe également le contrôle du contentiterator - Toutefois, il est lent, car il utilise plusieurs requêtes pour obtenir les éléments pertinents à une heure ou par lots.

Récupération d'articles un à la fois:

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

Récupération d'articles en lots:

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

Cela pourrait aider: http://www.novolocus.com/2012/07/09/Dealing-with-large-lists-Part--Quel-Quels-Troussons-and-how -Il-causes-difficulté /

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top