Книга: C# для профессионалов. Том II
Пределы поиска
Пределы поиска
Такой поиск может охватывать несколько доменов. Чтобы ограничить поиск некоторым числом объектов или требуемым временем, необходимо определить несколько дополнительных свойств.
Свойства DirectorySearcher | Описание |
---|---|
ClientTimeout |
Максимальное время, в течение которого клиент ожидает, что сервер вернет результат. Если сервер не отвечает, то никаких записей не возвращается. |
PageSize |
При постраничном поиске сервер возвращает число объектов, определенных с помощью PageSize , а не весь результат. Это сокращает и время клиента для получения первого ответа, и необходимую память. Сервер посылает клиенту cookie, которое отправляется назад на сервер с запросом следующего поиска, чтобы поиск можно было продолжить в точке, где он закончился. |
ServerPageTimeLimit |
Это значение определяет время для постраничного поиска, чтобы вернуть число объектов, которое определено значением PageSize . Если время истекает до достижения значения PageSize , найденные до этого момента объекты возвращаются клиенту. Значение по умолчанию равно -1, что означает бесконечность. |
ServerTimeLimit |
Определяет максимальное время, в течение которого сервер будет искать объекты. Когда это время истекает, все найденные до этого момента объекты возвращаются клиенту. По умолчанию используется 120 секунд, и нельзя задать время поиска больше этого значения. |
ReferalChasing |
Поиск может распространяться на несколько доменов. Если корень, который определен в SearchRoot , является родительским доменом или корень не был определен, поиск может распространиться на домены-потомки. С помощью этого свойства можно определить, что поиск должен продолжаться на других серверах. ReferalChasingOption.None означает, что поиск не продолжается на другие серверы. С помощью значения ReferalChasingOption.Subordinate можно определить, что поиск должен переходить на домены-потомки. Когда поиск начинается в DC=Wrox, DC=COM, сервер возвращает множество результатов и ссылку на DC=France, DC=Wrox, DC=COM. Клиент может продолжить поиск в поддомене. ReferalChasingOption.External означает, что сервер может направить клиента на независимый сервер, которого нет в поддомене. Это вариант поведения по умолчанию. Для ReferalChasingOption.All возвращаются ссылки на внешние домены и подчиненные домены. |
В рассматриваемом примере поиска мы хотим найти все объекты пользователей в организационной единице Wrox Press, где свойство description
содержит значение Author
.
Сначала мы соединяемся с организационной единицей Wrox Press. Здесь начинается поиск. Создадим объект DirectorySearcher
, где задан SearchRoot
. Фильтр определяется как (&(objectClass=user)(description=Auth*)
) для того, чтобы мы нашли все объекты типа user
, где свойство description
начинается с последовательности Auth
, за которой может следовать что-то еще. Область поиска должна быть поддеревом, чтобы поиск происходил в порождаемых организационных единицах для Wrox Press:
DirectoryEntry de new DirectoryEntry();
de.Path = "LDAP://OU=Wrox Press, " + "DC=eichkogelstrasse, DC=local";
DirectorySearcher searcher = new DirectorySearcher();
searcher.SearchRoot = de;
searcher.Filter = "(&(objectClass=user)(description=Auth*))";
searcher.SearchScope = SearchScope.Subtree;
В результате поиска мы хотим получить свойства name
, description
, givenName
, и wWWHomePage
.
searcher.PropertiesToLoad.Add("name");
searcher.PropertiesToLoad.Add("description");
searcher. PropertiesToLoad.Add("givenName");
searcher.PropertiesToLoad.Add("wWWHomePage");
Мы готовы начать поиск. Однако, результат необходимо отсортировать. DirectorySearcher
имеет свойство Sort
, где можно задать SortOption
. Первый аргумент конструктора SortOption
определяет свойство, по которому будет проводиться сортировка, второй аргумент определяет направление сортировки. Перечисление SortDirection
имеет значения Ascending
и Descending
.
Чтобы начать поиск, можно использовать метод FindOne()
для нахождения первого объекта или FindAll()
, чтобы найти все объекты. FindOne()
вернет простой SearchResult
, FindAll()
вернет SearchResultCollection
. Мы хотим получить всех авторов, поэтому используем FindAll()
:
searcher.Sort = new SortOption("givenName", SortDirection.Ascending);
SearchResultCollection Results = searcher.FindAll();
С помощью цикла foreach
мы получаем доступ ко всем SearchResult
в SearchResultCollection
. SearchResult
представляет один объект в кэше поиска. Свойство Properties
возвращает ResultPropertyCollection
, где мы получаем доступ ко всем свойствам и значениям по имени свойства и по индексу.
SearchResultCollection results = Searcher.FindAll();
foreach (SearchResult result in results) {
ResutPropertyCollection props = result.Properties;
foreach (string propName in props.PropertyNames) {
Console.Write(propName + ": ");
Console.WriteLine(props[propName][0]);
}
Console.WriteLine();
}
}
Если необходимо получить весь объект после поиска, то это также возможна. SearchResult
имеет метод GetDirectoryEntry()
, который возвращает соответствующую запись DirectoryEntry
найденного объекта.
Результирующий вывод показывает начале списка всех авторов книги Professional C# с выбранными свойствами
- Общие рекомендации поиска неисправностей
- Как указать направление поиска в Microsoft Word?
- Использование строки поиска
- Сохранение результатов поиска
- Раздел VI Управление глобальной инфраструктурой Сети: в поисках оптимальной модели
- Условия поиска
- 1.11.9. Особенности поиска по блогам
- Факторы, влияющие на ранжирование результатов поиска в поисковых машинах
- 10.7. В поисках аксиом
- 6.2. Функции сортировки и поиска
- Перекомпоновка дерева бинарного поиска
- Пример: сортировка файлов с использованием бинарного дерева поиска