2008-09-18 48 views
62

我剛剛注意到,結果的返回列表限制爲1000.我的域中有超過1000個組(巨大域)。我怎樣才能獲得超過1000條記錄?我可以從稍後的記錄開始嗎?我可以將它切成多個搜索嗎?我可以從ASP.NET中的DirectorySearcher獲得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;,但這似乎不起作用。有任何想法嗎?

回答

152

您需要將DirectorySearcher.PageSize設置爲非零值以獲取所有結果。

BTW你也應該處理的DirectorySearcher當你與它

using(DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps)) 
{ 
    srch.PageSize = 1000; 
    var results = srch.FindAll(); 
} 

完成API文檔不是很清楚,但本質:

  • 當你做一個分頁搜索, SizeLimit被忽略,並且在遍歷FindAll返回的結果時返回所有匹配結果。結果將一次從服務器頁面檢索。我選擇了1000以上的值,但如果您願意,可以使用較小的值。折中方法是:使用小頁面大小將更快地返回每頁結果,但在迭代大量結果時需要更頻繁地調用服務器。

  • 默認情況下,搜索不是分頁(PageSize = 0)。在這種情況下,返回SizeLimit結果。

由於蔽日指出的那樣,處置findAll返回的SearchResultCollection是很重要的,否則你可能有內存泄漏在MSDN文檔爲DirectorySearcher.FindAll備註部分描述:http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx

一在.NET 2.0或更高版本中幫助避免這種情況的方法是編寫一個自動配置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(DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps)) 
{ 
    srch.PageSize = 1000; 
    var results = SafeFindAll(srch); 
} 
+4

優秀的解決方法。值得讚賞。 – Biri 2008-09-18 07:40:38

相關問題