У меня есть 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 сотрудников. Вы можете сказать, что поиск может занять несколько секунд, чтобы привести всех пользователей в список.
Есть ли что-нибудь, что вы можете видеть, похоже, что оно может быть оптимизировано?
Почему бы не кэшировать все при первом запуске, а затем извлечь из списка, где он совпадает? Кажется, это было бы намного более эффективно, чем повторять его снова и снова. – Dispersia
Для проверок производительности всегда рекомендуется определять горячие точки с помощью профилировщика. Visual Studio имеет действительно хорошую производительность и профайлер памяти на борту. – Ben