2011-01-14 12 views
4
 using (DirectorySearcher srch = new DirectorySearcher(String.Format("(memberOf= {0})",p_Target.DistinguishedName))) 
    { 
      srch.PageSize = 2; 
      SearchResultCollection results = results = srch.FindAll(); 
      int count = results.Count; 
    } 

zählen = 3 (DREI) und nicht 2. Warum ist das? Ich möchte nicht alle Ergebnisse in nur einer Seite haben. Ich weiß, dass PageSize = 2 doof klein ist, aber ich setze diesen Wert in diesem Fall nur für Testzwecke (in Wirklichkeit wird es mehr sein).DirectorySearch.PageSize = 2 funktioniert nicht

Antwort

5

Die pageSize legt die Anzahl der Datensätze fest, die bei einer Suche mit einer Seitennummer zurückgegeben werden. Die Seitensuche ist eine grundlegende Sache auf LDAP-Protokollebene. Es ist für dich transparent. Obwohl Sie die PageSize auf 2 setzen, wird DirectorySearcher alle Ergebnisse für Sie zurückgeben, aber in Ihrem Fall in zwei seitenweise Suchantwortpakete.

Um zu tun, was Sie wollen, sollten Sie stattdessen SizeLimit verwenden. Es wird gesteuert, wie viele Datensätze insgesamt zurückgegeben wurden.

Hier ist eine weitere knifflige Sache. Windows Server hat ein Limit auf der Serverseite festgelegt. In jedem der ausgelagerten Suchergebnisse kann er höchstens 1000 Einträge zurückgeben. Sie müssen also sorgfältig die PageSize und SizeLimit einstellen, wenn Sie mehr als 1000 Einträge erhalten. Wenn Sie PageSize = 0 (dh unbegrenzt) und SizeLimit = 0 (dh unbegrenzt) festlegen, erhalten Sie einen Fehler, da der Windows-Server Ihnen nicht mehr als 1000 Einträge auf einer einzigen Seite zurückgeben kann. Wenn Sie die Seitengröße = 800 und die GrößeLimit = 0 (dh unbegrenzt) einstellen, erhalten Sie alle Ergebnisse, und wenn Sie sich den Netzwerk-Sniffer anschauen, werden Sie feststellen, dass es eine Reihe von LDAP-Suchergebnissen gibt. In den einzelnen Suchergebnissen sehen Sie 800 Einträge.

EDIT

Hier ist eine mehr elabrated Antwort auf die Frage in Ihrem Kommentar.

Hm, interessant. Bitte helfen Sie mir besser zu verstehen, diesen Mechanismus: wenn in AD I 5000 Zeilen haben, Seitengröße von Directory befindet sich auf 1000 gesetzt, Sizelimit auf 0 gesetzt ist und max Server Grenze ist 1000. Wie viele Aufruf von directorySearcher.FindAll () Muss ich in meinem Code haben, um alle 5000 Ergebnisse zu erhalten? 5 oder 1

Unabhängig davon, wie viele Datensätze zurückgeliefert werden, brauchen Sie immer nur einen Aufruf von DirectorySearcher. DirectorySearcher erledigt den Rest für Sie. Es aggregiert das seitenweise Suchergebnis und zeigt es in einem einzelnen IEnumerable an, obwohl die Daten möglicherweise aus verschiedenen Antwortpaketen stammen. Ich denke, Sie möchten PageLimit festlegen, weil Sie nicht möchten, dass alle 5000 Ergebnisse auf einmal zurückgegeben werden und Ihren Speicher belegen. Mach dir deswegen keine Sorgen. DirectorySearcher speichert nicht alle 5000 Ergebnisse in Ihrem Speicher, solange Sie keine Referenz auf jedes zurückgegebene SearchResult halten. Es wird nicht warten, bis alle Antwortpakete zurückkommen. Sobald das erste Antwortpaket zurückkommt, gibt FindAll() das Ergebnis an Sie zurück. Wenn Ihr Programm so schnell ist, dass nach der Verarbeitung der 1000 Ergebnisse das zweite Suchergebnispaket noch nicht angekommen ist. Der Aufruf von MoveNext() wird blockiert und wartet, bis das zweite Suchergebnispaket empfangen wird.

+0

Hm, interessant. Bitte helfen Sie mir, diesen Mechanismus besser zu verstehen: Wenn ich in AD 5000 Zeilen habe, ist PageSize von DirectorySearcher auf 1000 gesetzt, SizeLimit ist auf 0 gesetzt und die maximale Servergrenze ist 1000.Wie viele Aufrufe von directorySearcher.FindAll() muss ich in meinem Code haben, um alle 5000 Ergebnisse zu erhalten? 5 oder 1? – Bero

+0

@Bero Sie brauchen nur 1 Anruf –

+0

@Bero Ich habe begrenzte Textanzahl in Kommentar. Ich aktualisiere meine Antwort. Hoffe, das kann Ihnen helfen, mehr zu verstehen –