Error en mi elemento web personalizado:El intento de operación está prohibido porque excede el umbral de vista de lista impuesto por el administrador

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

  •  29-09-2020
  •  | 
  •  

Pregunta

Estoy usando sharepoint 2010.He creado un elemento web personalizado.En este webpart es posible agregar un nuevo elemento.Antes de agregar este nuevo elemento, necesito seleccionar algunos valores de los cuadros desplegables.En el caso del receptor del último cuadro desplegable, hago esto en 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();
                }
            }

Cuando voy a la lista "Apparaat", veo 5002 elementos.Cuando llegué a la configuración de la lista veo esta información:

5002 elementos (el límite para esta vista de lista es 5000).

Cuando recibí la lista "Apparaat", todo está bien.Intento agregar 2 elementos y funciona bien.

¿Por qué mi elemento web personalizado me da la excepción del límite de retención y la GUI funciona bien?

¿Fue útil?

Solución

Encontré la solución solo.He creado un whilleloop.Se bucea en este bucle hasta el recuento del total de elementos.Dentro del bucle, tomo los primeros artículos de 1999 y agregándolo a una lista.Después de esto, tomo los segundos de 1999.Hará esta lógica hasta que alcances el recuento total de artículos.Después de esto, tiene una lista con todos los artículos y puede agregarlo al repetidor.La razón por la que usé los artículos de 1999 se debe a que es posible que el acelerador pueda disminuir de 5000 a 2000. El código personalizado también funcionará.

Otros consejos

En la función de recarga, cuando llame a Tolist (), obliga al contexto de los datos para emitir la consulta.En ese punto de su código, no ha especificado ningún filtro (donde se encuentren la cláusula), por lo que se leen todos los registros.(Bueno, intentó ser leído).

La propiedad DataSource puede aceptar una fuente iQeryable, por lo que simplemente elimine las llamadas tolistas (cambie el método de ReloadFunctions también) y debe estar bien.

Las consultas de LINQ a SharePoint tienen un límite de fila predeterminado de INT máximo que es 2147483647 y aparentemente no se puede cambiar.Su consulta probablemente regrese más de 5000 artículos y superando los umbrales.

Para asegurarse de que no está excediendo el umbral, debe usar el objeto Spquery y escribir su consulta en Caml y configurar la propiedad Rowlimit a 5000. Necesitará algo así.Cambiar la consulta de 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();

esto explica lo que está pasando:

El intento de operación está prohibido porque supera la vista de lista Umbral aplicado por el administrador

¡Lo establece el administrador en una lista de la administración central en la aplicación web!

Puede usted ir a administrador central -> gestión de aplicaciones -> administrar aplicaciones web -> seleccionar el Aplicación web que contiene la lista dada -> dentro de la pestaña de arriba, haga clic en el desplegable para Configuración general -> seleccionar limitación de recursos.

Esto debería mostrarle un cuadro emergente con la configuración de la aplicación web establecida por el administrador.Si te desplazas hacia abajo verás Umbral de búsqueda de vista de lista , de forma predeterminada creo que está configurado en 5000, puedes aumentar este número a algo mayor.

Encuentro este problema cuando tengo flujos de trabajo en ejecución en la lista, produce el mismo error pero esto se debe a Umbral de búsqueda de vista de lista que está configurado en 8 de forma predeterminada, puedes aumentar este número a 100 y estoy casi seguro de que funcionará.

Entiendo que algunas personas dicen que devolver todos los datos es incorrecto, sí, eso es cierto hasta cierto punto...¿Qué pasa si lo necesitas todo?¿Qué pasa si tienes más de 1 millón de registros?Sé que hay otras soluciones, pero esta es una y es fácil de rectificar dentro de la configuración del administrador central y si su servidor puede soportar la tensión, esta es una opción simple.

Especifica el número máximo de elementos de lista o biblioteca que debe tener una base de datos operación, como una consulta, puede procesarse a la vez.Operaciones que que superen este límite se bloquean.

Para darle tiempo a hacer planes alternativos, SharePoint 2010 le advierte en la página Configuración de lista cuando la lista haya superado los 3.000 elementos.El warning contiene un vínculo de ayuda a este tema.

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

Este es el comportamiento esperado: SharePoint tiene una característica llamada 'Limitación de consultas', que está diseñada para evitar que las consultas de listas ineficientes afecten negativamente el rendimiento de los usuarios.

Este límite está establecido en 5000 y probablemente debería no ser cambiado.La razón por la que está configurado en 5000 es que con más de 5000 elementos, la base de datos SQL subyacente pasa del bloqueo de filas al bloqueo de tablas.Como SharePoint almacena gran parte de su contenido en una tabla en la base de datos de contenido, esto puede tener un impacto significativo en el rendimiento de su sistema y puede afectar muchas colecciones de sitios.

Ahora, existen algunas formas de mitigar el Query Throttle.En primer lugar, puede utilizar índices de columnas en su lista.Así como consultar una columna de una tabla SQL no indexada fuerza un escaneo de la tabla, consultar una columna de Lista no indexada hace lo mismo.Si esa lista contiene más de 5000 elementos, bueno, aprieta el acelerador.Sin embargo, una columna indexada significa que sólo puede recuperar las filas que necesita.

Si necesita rastrear cada elemento en una lista grande, también existe el control ContentIterator; sin embargo, esto es lento, ya que utiliza múltiples consultas para obtener los elementos relevantes, ya sea uno a la vez o en lotes.

Recuperar elementos uno por uno:

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

Recuperar artículos en 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;
    }
);

Esto podría ayudar: http://www.novolocus.com/2012/07/09/dealing-with-large-lists-part-1-what-is-throttling-and-how-it-causes-difficulty/

Licenciado bajo: CC-BY-SA con atribución
scroll top