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(三)而不是2。为什么?我不想在一页上显示所有结果。我知道PageSize = 2很小,但是在这种情况下,我只是为了测试目的而设置了该值(实际上会更多)。

最佳答案

pageSize用于设置一次分页搜索中返回的记录数。分页搜索是LDAP协议(protocol)级别的基础。对您透明。尽管您将PageSize设置为2,DirectorySearcher会为您返回所有结果,但在您的情况下,将以两个页面搜索答复数据包的形式返回。

若要执行所需的操作,应改用SizeLimit。它会控制总共返回多少条记录。

这是另外一件棘手的事情。 Windows Server在服务器端设置了一个限制。在每个分页的搜索结果中,它最多只能返回1000个条目。因此,如果您得到的结果超过1000个条目,则需要谨慎设置PageSize和SizeLimit。如果您设置PageSize = 0(表示无限制)和SizeLimit = 0(表示无限制),则将出现错误,因为Windows服务器无法在一个页面中返回1000个以上的条目。如果将Pagesize = 800设置为SizeLimit = 0(表示无限制),则将获得所有结果,并且如果您查看网络嗅探器,则会看到一堆LDAP页面搜索结果。在每个页面搜索结果中,您看到800个条目。

编辑

这是对您评论中问题的更详尽的答复。



无论要返回多少记录,您始终只需要在DirectorySearcher上调用1次。 DirectorySearcher将为您处理其余的工作。它将汇总分页的搜索结果,并以单个IEnumerable的形式呈现给您,即使数据可能来自不同的回复数据包也是如此。我猜您想设置PageLimit是因为您不希望所有5000个结果一次全部返回并占用您的内存。不用担心。只要您不对每个返回的SearchResult保留引用,DirectorySearcher不会将所有5000个结果存储在您的内存中。它也不会等到所有回复数据包都返回。第一个回复数据包返回后,FindAll()会将结果返回给您。如果您的程序运行速度如此之快,以至于您处理了1000个结果之后,第二个分页的搜索结果包仍未到达。 MoveNext()上的调用将被阻止,并等待直到第二个分页的搜索结果包被删除。

关于c# - DirectorySearch.PageSize = 2不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4693284/

10-11 01:14