如何在LINQ和DTO中使用Await

时间:2017-02-24 14:07:07

标签: asp.net asp.net-web-api async-await asp.net-web-api2

我正准备在ASP.NET中创建一个新的WebAPI2项目。我试图让控制器从我创建的DTO返回数据,而不是EF创建的原始对象类。我一直关注a tutorial on Microsoft Docs并且已经使用我的方法返回使用DTO工作的所有记录,但我无法弄清楚如何正确修改只返回带有ID的记录的方法使用异步任务匹配传递的参数,就像默认方法一样。

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的Await / Async功能来异步执行查询。我会诚实地承认,我实际上并不知道这是否重要,但我觉得如果默认方法是异步的,那么我应该这样做。我无法确定在哪里插入AsyncAwait关键字,以便实现这一目标。

1 个答案:

答案 0 :(得分: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);
 }