Получить всех пользователей Sitecore с пользовательским свойством
У меня есть решение Sitecore, которое имеет около 800 000 пользователей в двух доменах Sitecore.
Мне нужно экспортировать всех пользователей с одним пользовательским свойством.
Я начал с этого кода.....
var getAllUsers = UserManager.GetUsers();
var file = Sitecore.Configuration.Settings.GetSetting("AllUsersFile", @"C:\AllUsers.txt");
using (System.IO.StreamWriter datafile = new System.IO.StreamWriter(file))
{
datafile.WriteLine("{0},{1},{2}", "email", "domain", "subscribed");
foreach (var user in getAllUsers)
{
var dn = user.Domain.Name;
if (dn == "domain1" || dn == "domain2")
{
var profile = (UserProfile)user.Profile;
var email = profile.Email;
if (!string.IsNullOrWhiteSpace(email))
{
var domain = user.Domain;
var subscribed = profile.GetCustomProperty(Settings.Account.SubscribedToNewsletter).ToBool();
datafile.WriteLine("{0},{1},{2}", email, domain, subscribed ? "1" : "0");
}
}
}
}
var response = new StringBuilder();
response.AppendLine("Done.");
SheerResponse.Alert(response.ToString());
После 30 часов работы он экспортировал 302 500, затем умер (без ошибок, он просто остановился). Я попытался запустить его снова с того места, где он остановился, но это так же медленно.
Я прочитал эту статью..
Так изменил код...
List<string> domainsList = new List<string> {"domain1", "domain2"};
var file = Sitecore.Configuration.Settings.GetSetting("AllUsersFile", @"C:\AllUsers.txt");
using (System.IO.StreamWriter datafile = new System.IO.StreamWriter(file))
{
datafile.WriteLine("{0},{1},{2}", "email", "domain", "subscribed");
foreach (string dname in domainsList)
{
List<User> getAllUsers = Domain.GetDomain(dname).GetUsers().ToList();
foreach (User user in getAllUsers)
{
var dn = user.Domain.Name;
var profile = (UserProfile)user.Profile;
var email = profile.Email;
if (!string.IsNullOrWhiteSpace(email))
{
var subscribed = profile.GetCustomProperty(Settings.Account.SubscribedToNewsletter).ToBool();
datafile.WriteLine("{0},{1},{2}", email, dn, subscribed ? "1" : "0");
}
}
}
}
var response = new StringBuilder();
response.AppendLine("Done.");
SheerResponse.Alert(response.ToString());
Теперь он работает в течение 6 часов, и он до сих пор не вернул список пользователей из первого домена, не говоря уже о том, чтобы получить пользовательское свойство для каждого.
Стоит ли ждать так долго? Есть ли другой способ сделать это так долго?
1 ответ
Если кто-то еще столкнется с этой проблемой, я так обошел ее в конце.
Я взял резервную копию живых баз данных и восстановил их как временные базы данных. Используя эти базы данных, я обновил свой код, чтобы удалить пользователя, как только у меня появятся детали, которые мне нужны. Чем больше пользователей удалили, тем быстрее они запустились. Как я сказал в вопросе, первые 300K заняли 30 часов, но после того, как они были удалены, следующие 100K заняли 1 час.
Не очень хорошее решение, но это было одноразовое извлечение данных.