マイカカスタムWebPartのエラー:管理者によって強制されるリストビューのしきい値を超えるため、試行された操作は禁止されています。
-
29-09-2020 - |
質問
SharePoint 2010を使用しています。カスタムWebPartを作成しました。このWebPartでは、新しいアイテムを追加することが可能です。この新しいアイテムを追加する前に、ドロップダウンボックスからいくつかの値を選択する必要があります。最後のドロップダウンボックスのイベント受信者では、コードでこれを行います。
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();
}
}
.
リストに「avealaat」に行くとき、私は5002個の項目があります。リストの設定に着いたとき、この情報が表示されます。
5002項目(このリストビューのシェルトーションは5000)です。
リストを手に入れたときはすべて問題ありません。私は2つのアイテムを追加して、うまく機能しています。
私のカスタムWebPartが私にTheShold Limit ExcetpionとGUIがうまく機能しているのか?
解決
私は自分で解決策を見つけました。私はWHILELOOPを作成しました。これでループしながら、総項目の数に達するまでループします。ループ内には、最初の1999年度を取り、リストに追加します。この後、私は1999年の2番目のアイテムを取ります。アイテムの総数に達するまで、このロジックを実行します。この後、あなたはすべてのアイテムを含むリストを持っていて、それをリピーターに追加することができます。私が1999年の項目を使用したのは、スロットルが5000から2000まで減少する可能性があるためです。カスタムコードも機能します。
他のヒント
リロード関数では、TOLIST()を呼び出すと、データコンテキストがクエリを発行します。その時点で、コード内のその時点で、フィルタ(WHERE句)を指定していないため、すべてのレコードが読み込まれます。(まあ、読み込もうとしました。)
DataSourceプロパティはiQueryableソースを受け入れることができますので、Tolist呼び出しを削除するだけです(ReloadFunctionsメソッドを変更してください)、OKです。
LINQからSharePointクエリには、2147483647の最大INTのデフォルトの行制限があり、明らかに変更できません。あなたのクエリはおそらく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();
. これは何が起こっているのか説明します:
リストビューを超えるため、試行された操作は禁止されています 管理者
によって強制されたしきい値
Webアプリケーション上の中央管理からリストに管理者に設定されています。
Central Admin - > アプリケーション管理 - > Webアプリケーションの管理 - > select select> < Strong> Webアプリケーション 一般設定 - > select リソーススロットリングの選択/ strong>。
これは、管理者によって設定されているWebアプリケーション設定を持つポップアップボックスを与えるはずです。あなたがスクロールしたら、 listビューのルックアップしきい値が表示されます。デフォルトでは、5000に設定されていると思います。
私はこの問題の遭遇一覧でワークフローを実行しているときに同じエラーを生成しますが、これはリストビューのルックアップしきい値デフォルトでは8に設定されているため、この番号を増やすことができます。 100に、それが機能することをほとんど証明します。
私は何人かの人々がすべてのデータを返すことが間違っていると言うことを理解しています、はい、それはいくつかの効果に忠実です...あなたがそれをすべて必要ならば?あなたが100万以上のレコードを超えているならば、私は他の解決策があることを知っていますが、これは1つであり、中央管理者設定内で修正が簡単で、サーバーがこれよりシンプルなオプションです。
データベースがデータベースの最大数またはライブラリ項目の数を指定します クエリなどの操作は一度に処理できます。それを操作します この制限を超えるとブロックされています。
代替計画を立てる時間を与えるために、SharePoint 2010はあなたに警告します リスト設定ページで、リストが3,000項目を超えた場合。 the 警告このトピックへのヘルプリンクを含みます。
これは予想される動作です - SharePointは「Query Throttling」という機能を持っています。これは、非効率的なリストクエリをユーザーのパフォーマンスに悪影響を及ぼしないように設計されています。
この制限は5000に設定されており、これはおそらくが変更されていないはずです。 5000に設定されているのは、5000以上の項目で、基盤となるSQLデータベースが行ロックからテーブルロックにエスカレートします。 SharePointがコンテンツデータベースの1つのテーブルに多くのコンテンツを格納するので、これはシステムのパフォーマンスに大きな影響を与える可能性があり、これは多くのサイトコレクションに影響を与える可能性があります。
今、クエリスロットルを軽減する方法はいくつかあります。まず、リストの列インデックスを使用できます。インデックスされていないSQLテーブルの列を照会するときは、テーブルスキャンを強制するので、インデックス化されていないリスト列を照会します。そのリストに5000以上の項目が含まれている場合は、スロットルにヒットします。ただし、インデックス付きの列は、必要な行を取得できることを意味します。
大規模なリストで各項目をトロールする必要がある場合は、ContentIteratorコントロールもあります。ただし、これは複数のクエリを使用して関連項目を一度に1つまたはバッチで入手するため、これは遅くなります。
アイテムの取得1時1回目:
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;
}
);
.
これは役に立つかもしれません: