Code: Select all
var allUsers = _userManager.Users.OrderBy(x => x.FirstName);
var usersViewModel = new List();
foreach (var user in allUsers)
{
var tempVm = new UsersViewModel()
{
Id = user.Id,
UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
DisplayName = user.DisplayName,
Email = user.Email,
Enabled = user.Enabled,
Roles = String.Join(", ", await _userManager.GetRolesAsync(user))
};
usersViewModel.Add(tempVm);
}
< /code>
Bei dem Versuch, den Code zu vereinfachen, dachte ich, ich könnte so etwas tun
(kaputte Code) < /strong>: < /p>
var usersViewModel = allUsers.Select(user => new UsersViewModel
{
Id = user.Id,
UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
DisplayName = user.DisplayName,
Email = user.Email,
Enabled = user.Enabled,
Roles = string.Join(", ", await _userManager.GetRolesAsync(user))
}).ToList();
vermute, dass die GetRolesAsync () -Methode eine Aufgabe zurückgibt und sie anstelle der tatsächlichen Ergebnisse dieser Aufgabe Rollen zuweist. Was ich für mein Leben von mir nicht herausfinden kann, ist, wie man es funktioniert. Hier sind einige, die ich mir angesehen habe:
Ist es möglich, in einer nicht asynchronisierten Methode eine erwartbare Methode aufzurufen?
https: // blogs .msdn.microsoft.com/pfxteam/2012/04/12/asyncawe-faq/
Aufrufen der Async-Methode in iEnumerable.Select
How to to Warten Sie eine Liste von Aufgaben, die asynchron unter Verwendung von Linq? Sammlung < /p>
Zugegebenermaßen verstehe ich nicht vollständig, wie asynchron /wartet das funktionieren, also ist das wahrscheinlich Teil des Problems. Mein Foreach -Code funktioniert, aber ich möchte verstehen, wie ich es so läuft, wie ich es versuche. Da ich schon so viel Zeit damit verbracht habe, dachte ich, dass dies eine gute erste Frage wäre. /strong> < /p>
Ich denke, ich muss erklären, was ich in jedem Fall der Artikel getan habe, die ich recherchiert habe, damit dies nicht als doppelte Frage gekennzeichnet ist - und ich habe mich wirklich sehr bemüht Vermeiden Sie dies:-/. Während die Frage ähnlich klingt, sind die Ergebnisse nicht. Im Fall des Artikels, der als Antwort gekennzeichnet war, habe ich den folgenden Code ausprobiert: < /p>
public async Task Users()
{
var allUsers = _userManager.Users.OrderBy(x => x.FirstName);
var tasks = allUsers.Select(GetUserViewModelAsync).ToList();
return View(await Task.WhenAll(tasks));
}
public async Task GetUserViewModelAsync(ApplicationUser user)
{
return new UsersViewModel
{
Id = user.Id,
UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
DisplayName = user.DisplayName,
Email = user.Email,
Enabled = user.Enabled,
Roles = String.Join(", ", await _userManager.GetRolesAsync(user))
};
}
< /code>
Ich habe auch versucht, Assenumerable wie SO zu verwenden: < /p>
var usersViewModel = allUsers.AsEnumerable().Select(async user => new UsersViewModel
{
Id = user.Id,
UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
DisplayName = user.DisplayName,
Email = user.Email,
Enabled = user.Enabled,
Roles = string.Join(", ", await _userManager.GetRolesAsync(user))
}).ToList();
< /code>
Beide erstellen die Fehlermeldung: "InvalidOperationException: Ein zweiter Operation, der in diesem Kontext gestartet wurde, bevor eine frühere Operation abgeschlossen ist. Alle Instanzmitglieder sind nicht garantiert, dass sie Thread sicher sind."
Zu diesem Zeitpunkt scheint es, als wäre mein ursprüngliches Nacheig Machen Sie es mit den asynchronen Methoden. Arbeiten Sie mit dem folgenden Code: < /p>
var userViewModels = allUsers.Result.Select(async user => new UsersViewModel
{
Id = user.Id,
UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
DisplayName = user.DisplayName,
Email = user.Email,
Enabled = user.Enabled,
Roles = string.Join(", ", await _userManager.GetRolesAsync(user))
});
var vms = await Task.WhenAll(userViewModels);
return View(vms.ToList());
< /code>
Obwohl ich jetzt, wo ich die Kommentare aller berücksichtigt habe, habe ich den SQL -Profiler genauer gesucht, nur um zu sehen, wie viele Treffer die DB tatsächlich bekommen - wie Matt Johnson erwähnt hat, ist es viel (N+1). Der Benutzer wird ausgewählt. Ich habe diese Frage jedoch definitiv viel gelernt (und mehr von dem, was ich nicht weiß), also danke an alle.