0

У меня есть JsonResult, который ищет всех пользователей в активном каталоге и добавляет их в список. Однако поиск проходит через некоторое время, так как есть много сотрудников.Как я могу оптимизировать свою функцию

Вот JsonResult:

public JsonResult Search(string term) 
{ 
    List<string> lstADUsers = new List<string>();  
    if (!string.IsNullOrEmpty(term)) 
    { 
     using (var context = new PrincipalContext(ContextType.Domain, null, "LDAP")) 
     { 
      UserPrincipal user = new UserPrincipal(context); 
      using (var searcher = new PrincipalSearcher(new UserPrincipal(context))) 
      {     
       foreach (var result in searcher.FindAll().Where(m => m.SamAccountName.StartsWith(term, StringComparison.OrdinalIgnoreCase))) 
       { 
        DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;      
        string usersWithName; 
        if (!String.IsNullOrEmpty((String)de.Properties["samaccountname"].Value) && !String.IsNullOrEmpty((String)de.Properties["sn"].Value) && !String.IsNullOrEmpty((String)de.Properties["givenName"].Value)) 
        { 
         usersWithName = de.Properties["samaccountname"].Value.ToString(); 
         lstADUsers.Add(usersWithName); 
        } 
       } 
      } 
     } 
    } 

    return Json(lstADUsers, JsonRequestBehavior.AllowGet); 
} 

Сейчас он просматривает до тех пор, пока не найдет то, что начинается с того, что набрал пользователь:

Если я ищу Jane.Doe и я набранный; Ja, он показывает мне список всех пользователей в активном каталоге, которые начинаются с Ja. Было бы хорошо, как это работает, если бы не было более 10000 сотрудников. Вы можете сказать, что поиск может занять несколько секунд, чтобы привести всех пользователей в список.

Есть ли что-нибудь, что вы можете видеть, похоже, что оно может быть оптимизировано?

+2

Почему бы не кэшировать все при первом запуске, а затем извлечь из списка, где он совпадает? Кажется, это было бы намного более эффективно, чем повторять его снова и снова. – Dispersia

+1

Для проверок производительности всегда рекомендуется определять горячие точки с помощью профилировщика. Visual Studio имеет действительно хорошую производительность и профайлер памяти на борту. – Ben

ответ

2

Согласно FindAll выполняет фактический вызов (который, как я полагаю, занимает большую часть времени), и только после этого вы применяете фильтры.

Лучшим решением было бы применить фильтры перед вызовом метода FindAll для уменьшения количества возвращаемых данных. Вы достигаете этого с использованием свойства QueryFilter. Вы можете найти примеры использования in this thread.

+0

Это очень помогло! –

Смежные вопросы