2011-01-14 59 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; 
    } 

count = 3(THREE)而不是2.爲什麼?我不想只在一頁中獲得所有結果。我知道PageSize = 2很傻,但在這種情況下,我只是爲了測試目的而設置了這個值(實際上它會更多)。DirectorySearch.PageSize = 2不起作用

回答

5

pageSize用於設置在一次分頁搜索中返回的記錄數。分頁搜索是LDAP協議級別的基礎。它對你來說是透明的。雖然您將PageSize設置爲2,但DirectorySearcher會爲您返回所有結果,但在您的情況下將返回兩個分頁搜索回覆數據包。

要做你想做的事,你應該使用SizeLimit來代替。它將控制總共返回多少條記錄。

這是一個更棘手的事情。 Windows Server在服務器端設置了一個限制。在每個分頁的搜索結果中,它最多隻能返回1000個條目。因此,如果結果超過1000個條目,則需要小心設置PageSize和SizeLimit。如果您設置PageSize = 0(意思是無限制)和SizeLimit = 0(意思是無限制),則會出現錯誤,因爲Windows服務器無法在單個頁面中返回超過1000個條目。如果您設置Pagesize = 800和SizeLimit = 0(意思是無限制),您將獲得所有結果,並且如果您查看網絡嗅探器,則會看到有一堆LDAP分頁搜索結果。在每個分頁的搜索結果中,您會看到800個條目。

編輯

這裏是在您的評論的問題更elabrated答覆。

嗯,有趣。請幫我 更好地瞭解這種機制:如果在AD 我有5000行, 的DirectorySearcher的每頁設置爲1000, 的sizeLimit設置爲0和max server 極限是1000 directorySearcher.FindAll的多少調用( )我需要 在我的代碼中得到所有5000 的結果? 5或1

無論要返回多少條記錄,您始終只需在DirectorySearcher上進行一次呼叫。 DirectorySearcher將爲您處理剩下的事情。它將彙總分頁的搜索結果,並以單個IEnumerable呈現給您,即使數據可能來自不同的回覆數據包。我想你想設置PageLimit,因爲你不希望所有5000個結果一次全部返回並佔用你的內存。別擔心。只要您沒有參考每個返回的SearchResult,DirectorySearcher就不會將全部5000個結果存儲在您的記憶中。它不會等到所有回覆數據包都回來。只要第一個回覆數據包回來,FindAll()會將結果返回給您。如果您的程序速度如此之快,以至於在處理1000個結果之後,第二個分頁的搜索結果數據包仍未到達。 MoveNext()上的調用將被阻止,並等待收到第二個分頁的搜索結果數據包。

+0

恩,有意思。請幫助我更好地理解此機制:如果在AD中有5000行,Dir​​ectorySearcher的PageSize設置爲1000,SizeLimit設置爲0,最大服務器限制爲1000。多少次調用directorySearcher.FindAll()我需要在我的代碼中獲得所有5000個結果? 5還是1? – Bero 2011-01-15 16:10:53

+0

@Bero你只需要1個電話 – 2011-01-15 17:34:58