获取所有Sitecore用户的自定义属性

时间:2017-04-11 15:26:16

标签: c# sitecore sitecore8

我有一个Sitecore解决方案,在两个Sitecore域中拥有大约800,000个用户。

我需要使用一个自定义属性导出所有用户。

我开始使用此代码.....

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然后死了(没有错误,它刚刚停止)。我试图从它停止的地方再次启动它,但这也很慢。

我看过https://pastebin.com/v10U2J2Z文章..

所以改了代码......

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 个答案:

答案 0 :(得分:0)

如果有其他人遇到这个问题,最后我就是这样做的。

我备份了实时数据库,并将它们恢复为临时数据库。在使用这些数据库时,我更新了我的代码,以便在我获得详细信息后删除用户。删除的用户越多,运行得越快。正如我在问题中所说的那样,第一个300K需要30个小时,但在删除之后,下一个100K需要1个小时。

不是一个很好的解决方案,但它是一次性的数据提取。