首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以从DirectorySearcher中获得1000条以上的记录吗?

我可以从DirectorySearcher中获得1000条以上的记录吗?
EN

Stack Overflow用户
提问于 2008-09-18 07:11:26
回答 2查看 64.5K关注 0票数 74

我刚刚注意到结果的返回列表被限制为1000个。我在我的域(巨大的域)中有1000多个组。怎样才能得到1000条以上的记录?我可以从以后的记录开始吗?我能把它分成多个搜索吗?

下面是我的问题:

代码语言:javascript
复制
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;,但似乎不起作用。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-09-18 07:15:45

您需要将DirectorySearcher.PageSize设置为非零值才能获得所有结果。

顺便说一句,您还应该在使用完DirectorySearcher后将其处理掉

代码语言:javascript
复制
using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = srch.FindAll();
}

API文档不是很清楚,但本质上是:

  • 执行分页搜索时,将忽略SizeLimit,并在迭代FindAll返回的结果时返回所有匹配的结果。将从服务器检索结果,一次检索一页。我选择了上面的值1000,但如果您愿意,也可以使用更小的值。权衡之处在于:使用较小的PageSize将更快地返回每页结果,但在迭代大量结果时需要更频繁地调用服务器。
  • 默认情况下不对搜索进行分页(PageSize = 0)。在这种情况下,最多返回SizeLimit结果。

正如Biri指出的,处理FindAll返回的SearchResultCollection非常重要,否则可能会导致as described in the Remarks section of the MSDN documentation for DirectorySearcher.FindAll内存泄漏。

在.NET 2.0或更高版本中,避免这种情况的一种方法是编写一个自动处理SearchResultCollection的包装器方法。这可能类似于以下内容(或者可能是.NET 3.5中的扩展方法):

代码语言:javascript
复制
public IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher)
{
    using(SearchResultCollection results = searcher.FindAll())
    {
        foreach (SearchResult result in results)
        {
            yield return result;        
        } 
    } // SearchResultCollection will be disposed here
}

然后,您可以按如下方式使用它:

代码语言:javascript
复制
using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = SafeFindAll(srch);
}
票数 185
EN

Stack Overflow用户

发布于 2021-09-02 11:50:57

我试图使用给定的解决方案来实现分页,但它不起作用。我设置了pageSize = 100;并且我通过searchResult获得了所有的项目。

(objectClass=user)(objectClass=printQueue)(objectClass=computer). (objectClass=organizationalUnit)(objectClass=Group))");= dirSearcher =新条目(目录);dirSearcher= ("(|(objectClass=volume). (objectClass=user)(objectClass=printQueue)(objectClass=computer).(objectClass=organizationalUnit)(objectClass=Group))“);

代码语言:javascript
复制
            dirSearcher.PageSize = 100;
            dirSearcher.SearchScope = System.DirectoryServices.SearchScope.Subtree;
            dirSearcher.ServerTimeLimit = new TimeSpan(1000);

            //dirSearcher.VirtualListView = new DirectoryVirtualListView(0, 100, 1);


            using (SearchResultCollection results = dirSearcher.FindAll())
            {
                foreach (SearchResult result in results)
                {
                    DirectoryEntry ent = result.GetDirectoryEntry();
                    ADItem ProviderItem = Context.ConvertToItem(ent, true);

                    if (ProviderItem != null)
                    {
                        ProviderItem.IsPartialData = true;
                        ProviderItems.Add(ProviderItem);
                    }
                }

            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/90652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档