#c# #entity-framework #console-application #asp.net-identity
#c# #сущность-фреймворк #консольное приложение #asp.net-идентификация #entity-framework #asp.net-identity
Вопрос:
У меня есть консольное приложение на C #, в котором я использую ASP.NET Идентификатор AddPasswordAsync для хэширования паролей в моей базе данных MSSQL. У меня есть около 50 000 записей для обновления. Я запускаю его в своей тестовой базе данных, и это занимает целую вечность.
Есть ли способ ускорить это?
foreach (var user in db.Member.Where(u => u.is_deleted == false).Select(u => new { id = u.id, pass = u.web_password, hash = u.password_hash }).ToList())
{
if (user.hash == null)
{
if (user.pass == null)
{
string newPass = RandomString(8);
var result = userManager.AddPasswordAsync(user.id, newPass).Resu<
Console.WriteLine(
"UserID: {0}, Password: {1}, Hashed: {2}",
user.id,
newPass,
result.Succeeded);
}
else
{
var result = userManager.AddPasswordAsync(user.id, user.pass).Resu<
Console.WriteLine(
"UserID: {0}, Password: {1}, Hashed: {2}",
user.id,
user.pass,
result.Succeeded);
}
}
}
Комментарии:
1. Возможно, параллельный. Цикл foreach может помочь вам вместо использования обычного цикла foreach.
2. Спасибо за этот совет, @Horizon. Я не смог вернуться к этому, но я понятия не имел о параллели. ForEach. Я обязательно попробую.
Ответ №1:
Может быть что-то вроде (при условии, что AddPasswordAsync заполняет столбец хэша):
int i = 500;
while ( i > 0) {
i = 0;
foreach (var user in db.Member.Where(u => u.is_deleted == false amp;amp; u.hash == null).Select(u => new { id = u.id, pass = u.web_password, hash = u.password_hash }).Take(500).ToList())
{
i ;
if (user.pass == null)
{
string newPass = RandomString(8);
var result = userManager.AddPasswordAsync(user.id, newPass).Resu<
Console.WriteLine(
"UserID: {0}, Password: {1}, Hashed: {2}",
user.id,
newPass,
result.Succeeded);
}
else
{
var result = userManager.AddPasswordAsync(user.id, user.pass).Resu<
Console.WriteLine(
"UserID: {0}, Password: {1}, Hashed: {2}",
user.id,
user.pass,
result.Succeeded);
}
}
}