DirectorySearcherから1000件以上のレコードを取得することはできますか?
質問
結果のリターンのリストが 1000 に制限されていることに気づきました。私のドメイン (HUGE ドメイン) には 1000 グループを超えるグループがあります。どのように私は1000以上のレコードを取得することができますか?後のレコードから始めることはできますか? 複数の検索に切り分けることはできますか?
以下は私のクエリです。
DirectoryEntry dirEnt = new DirectoryEntry("LDAP://dhuba1kwtn004");
string[] loadProps = new string[] { "cn", "samaccountname", "name", "distinguishedname" };
DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps);
var results = srch.FindAll();
私は srch.SizeLimit = 2000 としました。 を設定してみましたが、うまくいかないようです。何かアイデアはありますか?
どのように解決するのですか?
すべての結果を取得するためには、DirectorySearcher.PageSizeに0以外の値を設定する必要があります。
ちなみに、DirectorySearcherを使用し終わったら、Disposeする必要があります。
using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
srch.PageSize = 1000;
var results = srch.FindAll();
}
APIドキュメントがあまり明確ではありませんが、基本的には
-
ページ検索を行う場合、SizeLimit は無視され、FindAll によって返される結果を繰り返しながら、一致するすべての結果が返されます。 結果はサーバーから一度に1ページずつ取得されます。 私は上記の1000という値を選びましたが、お好みでもっと小さな値を使うこともできます。 トレードオフは、小さなPageSizeを使用すると、結果の各ページをより速く返しますが、多数の結果を反復処理する際にサーバーへの呼び出しがより頻繁に必要になることです。
-
は、デフォルトでは、検索はページングされません (PageSize = 0)。 この場合、SizeLimitまでの結果が返されます。
Biriさんが指摘されているように、FindAllが返すSearchResultCollectionをdisposeすることが重要で、そうしないとメモリリークが発生する可能性があります。 の MSDN ドキュメントの「備考」セクションで説明されているように、DirectorySearcher.FindAll の .
.NET 2.0以降でこれを回避するのに役立つ1つの方法は、SearchResultCollectionを自動的に破棄するラッパーメソッドを書くことです。 これは、次のように見えるかもしれません(または.NET 3.5で拡張メソッドになる可能性があります)。
public IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher)
{
using(SearchResultCollection results = searcher.FindAll())
{
foreach (SearchResult result in results)
{
yield return result;
}
} // SearchResultCollection will be disposed here
}
すると、次のように使うことができます。
using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
srch.PageSize = 1000;
var results = SafeFindAll(srch);
}
関連
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] .NETコンソールアプリケーションでアプリケーションのパスを取得するにはどうすればよいですか?
-
[解決済み] アセンブリファイルのバージョンを取得する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する