2008-09-18 1 views
62

Я только что заметил, что список результатов для результатов ограничен 1000. У меня более 1000 групп в моем домене (ОГРОМНЫЙ домен). Как я могу получить более 1000 записей? Могу ли я начать с более поздней записи? Могу ли я разрезать его на несколько поисков?Могу ли я получить более 1000 записей из DirectorySearcher в ASP.NET?

Вот мой запрос:

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 будет быстрее возвращать каждую страницу результатов, но потребует более частых вызовов на сервер при повторении большого количества результатов.

  • по умолчанию поиск не вызывается страницей (PageSize = 0). В этом случае возвращаются результаты до результата SizeLimit.

Как Biri отметил, что важно располагать SearchResultCollection возвращенное FindAll, в противном случае вы можете иметь утечку памяти, как описано в разделе Замечаний документации MSDN для DirectorySearcher.FindAll: http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx

One способ избежать этого в .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