C# 使用自定义属性获取所有Sitecore用户

C# 使用自定义属性获取所有Sitecore用户,c#,sitecore,sitecore8,C#,Sitecore,Sitecore8,我有一个Sitecore解决方案,在两个Sitecore域中拥有大约800000个用户 我需要导出具有一个自定义属性的所有用户 我从这个代码开始 var getAllUsers = UserManager.GetUsers(); var file = Sitecore.Configuration.Settings.GetSetting("AllUsersFile", @"C:\AllUsers.txt"); using (System.IO.StreamWriter datafile = ne

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

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

我从这个代码开始

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个小时后,它导出了302500,然后就死了(没有错误,只是停止了)。我试着从它停止的地方重新开始,但同样慢

我读了这篇文章

所以改变了密码

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());
List domainsList=新列表{“domain1”、“domain2”};
var file=Sitecore.Configuration.Settings.GetSetting(“AllUsersFile”,@“C:\AllUsers.txt”);
使用(System.IO.StreamWriter数据文件=新的System.IO.StreamWriter(文件))
{
WriteLine(“{0},{1},{2}”,“email”,“domain”,“subscribed”);
foreach(域列表中的字符串dname)
{
列出getAllUsers=Domain.GetDomain(dname.GetUsers().ToList();
foreach(getAllUsers中的用户)
{
var dn=user.Domain.Name;
var profile=(UserProfile)user.profile;
var email=profile.email;
如果(!string.IsNullOrWhiteSpace(电子邮件))
{
var subscribed=profile.GetCustomProperty(Settings.Account.SubscribedToNewsletter.ToBool();
WriteLine(“{0},{1},{2}”,电子邮件,dn,订阅?“1”:“0”);
}
}
}
}
var response=新的StringBuilder();
回复。附录行(“完成”);
SheerResponse.Alert(response.ToString());
它现在已经运行了6个小时,还没有返回第一个域的用户列表,更不用说开始获取每个域的自定义属性了


我应该期待这么长时间吗?有没有其他方法可以让我不用花这么长时间来解决这个问题?

如果其他人遇到这个问题,我最终就是这样解决的

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


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

这将需要很长时间。您应该在这里看看这个问题:您使用哪个会员资格提供商?您可以在SQL中在Sitecore外部进行te导出。另一种方法是使用与sitecore中的用户管理器相同的分页,使用x个用户进程,然后使用下一个。可能不会更快,但您可以暂停,然后从停止的地方继续。@JanBluemink Im使用ASP.NET成员身份。我可以直接从SQL表中获得所需的大部分内容,但无法获得所需的自定义属性。从我所看到的情况来看,我需要加载用户并使用
user.Profile.getCustomProperty
来获取此信息。我会看看寻呼,就像你们说的,至少我可以从它停止的地方开始。谢谢