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