2017-11-02 3 views
-1

Ich weiß, dass dies schon einmal gefragt wurde, aber ich kann einfach nicht herausfinden, wie man das richtig macht.Holen Sie sich das Ergebnis aus einer Liste von Aufgabe

So ist der Code unten ist offensichtlich falsch in dem Sinne, dass ich bin await etwas in einer Abfrage ing.

Dies macht den folgenden Fehler angezeigt: "Der" erwarten "-Operator kann nur innerhalb eines asynchronen Lambda-Ausdruck verwendet werden".

So finalisieren ich die Abfrage zuerst und ich mache das Lambda-Asynchron:

// GET: /<controller>/ 
    [HttpGet] 
    public new IActionResult Index() 
    { 
     var model = new List<Models.ViewModels.ApplicationUser.ListViewModel>(); 
     // get users first, so I don't have to async something in a Select 
     var users = _userManager.Users.ToList(); 
     // make the lambda asyc 
     model = users.Select(async u => new Models.ViewModels.ApplicationUser.ListViewModel 
     { 
      Id = u.Id, 
      Email = u.Email, 
      Name = u.GivenName + " " + u.SurName, 
      RoleNames = await _userManager.GetRolesAsync(u) 
     }).ToList(); 
     return View(model); 
    } 

Aber dann bekomme ich Cannot implicitly convert type 'System.Collections.Generic.List<System.Threading.Tasks.Task<Models.ViewModels.ApplicationUser.ListViewModel>>' to 'System.Collections.Generic.List<Models.ViewModels.ApplicationUser.ListViewModel>'

Also im Grunde (glaube ich) es sagt, dass ich eine Liste von Task davon habe Ich sollte das Ergebnis bekommen. Aber wie bekomme ich das Ergebnis davon Task? Oder besser: Was ist der beste Weg, dies zu tun?

Ich habe this und this und this überprüft, ohne näher zu kommen.

Antwort

1

Ihre Variablen mit dem Namen model sind vom Typ List<Task<ApplicationUser>>. Um eine List<ApplicationUser> zu bekommen, müssen Sie nur alle Aufgaben await. Auch jetzt ist der Anruf, um alle Benutzer zu bekommen, die Blockierungsvariante, die Sie für ToListAsync umschalten können. Versuchen Sie dies stattdessen:

[HttpGet] 
public async Task<IActionResult> Index() { 
    var model = new List<Models.ViewModels.ApplicationUser.ListViewModel>(); 
    // get users first, so I don't have to async something in a Select 
    var users = await _userManager.Users.ToListAsync(); 
    // make the lambda asyc 
    modelTasks = users.Select(async u => new Models.ViewModels.ApplicationUser.ListViewModel { 
     Id = u.Id, 
     Email = u.Email, 
     Name = u.GivenName + " " + u.SurName, 
     RoleNames = await _userManager.GetRolesAsync(u) 
    }).ToList(); 
    var users = await Task.WhenAll(modelTasks); 
    return View(users); 
} 
+0

Das funktioniert! Danke @JSteward – Arjan

Verwandte Themen