2008-09-18 46 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

相关问题