我的自定义WebPart中的错误:禁止尝试操作,因为它超出了管理员强制执行的列表视图阈值
-
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项时。这 警告包含与此主题的帮助链接。
这是预期的行为 - 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;
}
);
.