2017-11-02 10 views
-1

のリストから結果を取得これまでに質問されていることは分かっていますが、これを正しく行う方法を理解することはできません。タスク

したがって、以下のコードは明らかに私がawaitという質問になっているという意味で間違っています。

// GET: /<controller>/ 
    [HttpGet] 
    public new IActionResult Index() 
    { 
     var model = new List<Models.ViewModels.ApplicationUser.ListViewModel>(); 
     model = _userManager.Users.Select(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); 
    } 

これは、次のエラーを示しています。 "" await "演算子は、非同期ラムダ式内でのみ使用できます"。

だから、私は最初のクエリを確定し、私はラムダ非同期を行います

// 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); 
    } 

しかし、その後、私は(私が推測する)そこで、基本的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>'

を取得し、それは私がのTaskのリストを持っていると言います私は結果を得るべきです。しかし、このTaskからどのように結果を得ることができますか?またはこれより良い方法:これについては、最も良い方法は何ですか?

私はthisthisthisに近づかずにチェックしました。

答えて

1

変数modelの名前はList<Task<ApplicationUser>>です。 List<ApplicationUser>を取得するには、すべてのタスクをawaitする必要があります。また、現在、すべてのユーザーを取得する呼び出しは、ブロックバリアントであり、ToListAsyncを切り替えることができます。代わりにこれを試してみてください:

[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

それは機能します!ありがとう@JSteward – Arjan