我的自定义WebPart中的错误:禁止尝试操作,因为它超出了管理员强制执行的列表视图阈值

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

  •  29-09-2020
  •  | 
  •  

我正在使用SharePoint 2010.我已经创建了一个自定义WebPart。在此WebPart中,可以添加新项目。在添加此新项目之前,我需要从下拉框中选择一些值。在最后一个Dropdownbox的事件接收器中,我这样做的代码:

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

当我去列表“apparaat”时,我看到有5002个项目。当我到达列表的设置时,我看到此信息:

5002项(此列表视图的TheShold为5000)。

当我得到列表“Apparaat”一切正常。我尝试添加2个项目并正常工作。

为什么我的自定义webpart给我一下的极限excetpion,gui工作正常?

有帮助吗?

解决方案

我自己找到了解决方案。我创造了一个whileloop。它循环循环,直到达到总项目的计数。在循环内,我采取了1999年的项目并将其添加到列表中。在此之后,我采取了第二九九九年的项目。它会做这个逻辑,直到你达到了物品的总数。在此之后,您可以包含所有项目的列表,可以将其添加到转发器中。我使用的是1999年项目的原因是因为它可能会从5000到2000减少时。自定义代码也将工作。

其他提示

在重新加载函数中,当您调用tolist()时,它会强制数据上下文发出查询。此时在您的代码中,您尚未指定任何过滤器(其中包括子句),因此读取所有记录。(嗯,试图阅读。)

dataSource属性可以接受IQueryable源,因此只需删除Tolist调用(更改重新入函数方法),您应该可以确定。

LINQ到SharePoint查询具有最大int的默认行限制,这是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();
.

这解释了发生的事情:

禁止尝试操作,因为它超出了列表视图 管理员强制执行的阈值

它由admin设置在Web应用程序上的中央管理局中的列表中!

你可以转到 central admin - > 应用程序管理 - > 管理Web应用程序 - > 选择 < strong> web应用程序包含给定的列表 - >在上面的选项卡中单击下降 for 常规设置 - > select 资源漏洞< /强>。

这应该为您提供一个弹出框,其中包含admin设置的WebApplication设置。如果向下滚动,您会看到列表视图查找阈值,默认情况下,我认为它设置为5000,您可以将此号码增加到磨料器。

我在列表上运行工作流时遇到这个问题,它会产生相同的错误,但这是由于列表视图查找阈值设置为8,默认情况下,您可以增加此数字到100和我几乎证明它将工作。

我明白有些人说返回所有数据是错误的,是的,这是某种效果真的......如果你需要什么?如果你有超过100万条记录怎么办?我知道还有其他漏洞,但这是一个,很容易在Central Admin设置中纠正,如果您的服务器可以处理菌株,而不是这是一个简单的选项。

指定数据库的最大列表或库项数 操作(例如查询)可以一次处理。运营 超过此限制被阻止。

给您时间做出替代计划,SharePoint 2010警告您 在列表设置页面上超过3,000项时。这 警告包含与此主题的帮助链接。

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

这可能有助于:

许可以下: CC-BY-SA归因
scroll top