2017-02-24 25 views
0

我只是在ASP.NET中創建一個新的WebAPI2項目。我試圖讓控制器從我創建的DTO返回數據,而不是EF創建的原始對象類。我一直在遵循a tutorial on Microsoft Docs,並得到了我的方法,它返回的所有記錄使用DTO工作,但我無法弄清楚如何正確修改方法,它只返回ID與使用異步任務傳遞參數匹配的記錄,就像默認的方法一樣。如何使用LINQ和DTO等待

由Visual Studio生成的默認方法是這樣的:

[ResponseType(typeof(Post))] 
public async Task<IHttpActionResult> GetPost(int id) 
{ 
    Post post = await db.Post.FindAsync(id); 
    if (post == null) 
    { 
     return NotFound(); 
    } 

    return Ok(post); 
} 

,我有我的修改方法看起來像這樣:

[ResponseType(typeof(PostDTO))] 
public async Task<IHttpActionResult> GetPost(int id) 
{ 
    var _post = from p in db.Post 
       where p.PostID == id 
       select new PostDTO() 
       { 
        PostID = p.PostID, 
        SubmitTime = p.SubmitTime, 
        SubmitUsername = p.SubmitUsername, 
       }; 
    if (_post == null) 
    { 
     return NotFound(); 
    } 

    return Ok(_post); 
} 

這種方法工作得很好,但你可以看到,它不利用.NET的等待/異步功能異步執行查詢。我會誠實地承認,我實際上並不知道這是否重要,但我覺得如果默認方法是異步的,那麼我應該如此。我只是無法確定在哪裏插入AsyncAwait關鍵字來完成此項工作。

回答

0

您可以使用此方法,

[ResponseType(typeof(PostDTO))] 
public async Task<IHttpActionResult> GetPost(int id) 
{ 
    var _post = await (from p in db.Post 
        where p.PostID == id 
        select new PostDTO() 
        { 
         PostID = p.PostID, 
         SubmitTime = p.SubmitTime, 
         SubmitUsername = p.SubmitUsername, 
        }).ToListAsync(); 

     if (_post == null) 
     { 
      return NotFound(); 
     } 

     return Ok(_post); 
}