Получить всех пользователей 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 час.

Не очень хорошее решение, но это было одноразовое извлечение данных.

Другие вопросы по тегам