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很小,但我在这种情况下设置的值只是为了测试目的(实际上它会更多)。
答案 0 :(得分:6)
pageSize用于设置一次分页搜索中返回的记录数。分页搜索是LDAP协议级别的基础。这对你来说很透明。虽然您将PageSize设置为2,但DirectorySearcher将为您返回所有结果,但在您的情况下会返回两个分页搜索回复数据包。
要做你想做的事,你应该使用SizeLimit。它将控制总共返回的记录数。
这是一个更棘手的事情。 Windows Server在服务器端设置了限制。在每个分页搜索结果中,它最多只能返回1000个条目。因此,如果结果超过1000个,则需要小心设置PageSize和SizeLimit。如果设置PageSize = 0(表示无限制)和SizeLimit = 0(表示无限制),则会出现错误,因为Windows服务器无法在一个页面中返回超过1000个条目。如果您设置Pagesize = 800和SizeLimit = 0(意味着无限制),您将获得所有结果,如果您查看网络嗅探器,您将看到有一堆LDAP分页搜索结果。在每个分页搜索结果中,您会看到800个条目。
修改强> 的
以下是对评论中问题的详细回复。
嗯,有趣。请帮我 更好地了解这种机制:如果 在AD我有5000行,PageSize DirectorySearcher设置为1000, SizeLimit设置为0和max server 限制是1000.多少次电话 directorySearcher.FindAll()我需要 在我的代码中获得所有5000 结果如何? 5或1
无论要返回多少条记录,您始终只需要在DirectorySearcher上进行一次调用。 DirectorySearcher将为您处理剩下的事情。它将聚合分页搜索结果并在一个IEnumerable中呈现给您,即使数据可能来自不同的回复数据包。我想你想设置PageLimit,因为你不希望所有5000个结果同时返回并占用你的记忆。别担心。只要您没有在每个返回的SearchResult上保留引用,DirectorySearcher就不会将所有5000个结果存储在您的内存中。它不会等到所有回复数据包都返回。一旦第一个回复数据包返回,FindAll()就会将结果返回给您。如果你的程序太快,在处理1000个结果后,第二个分页搜索结果包仍然没有到达。 MoveNext()上的调用将被阻止,并等待接收到第二个分页搜索结果包。
答案 1 :(得分:0)
请看Ethan Wilansky的这段代码和相关文章,
http://msdn.microsoft.com/en-us/magazine/dd250826.aspx?code=true&level=root&file=VLVSrch.cs
完全符合你的要求。