返回IHttpActionResult与IEnumerable <Item> vs IQueryable <Item> [c#]


Answers

我会选择IEnumerable和IHttpActionResult之间,你可以用稍微不同的方式做这两个几乎相同的事情。 IQueryable通常用于较低级别的数据访问任务和延迟执行的SQL查询,所以我会保持它封装在您的数据访问类,而不是暴露在Web API。

以下是http://www.asp.net/web-api/overview/web-api-routing-and-actions/action-results的总结:

IHttpActionResult

IHttpActionResult接口是在Web API 2中引入的。基本上,它定义了一个HttpResponseMessage工厂。 下面是使用IHttpActionResult接口(通过HttpResponseMessage类)的一些优点:

  • 简化单元测试您的控制器。
  • 将用于创建HTTP响应的通用逻辑移到不同的类中。
  • 通过隐藏构建响应的底层细节使控制器动作的意图更清晰。

的IEnumerable的<item>

对于所有其他返回类型,Web API使用媒体格式化程序来序列化返回值。 Web API将序列化值写入响应主体。 响应状态码是200(OK)。

public class ProductsController : ApiController
{
    public IEnumerable<Product> Get()
    {
        return GetAllProductsFromDB();
    }
}

这种方法的一个缺点是你不能直接返回错误代码,比如404。但是,你可以为错误代码抛出一个HttpResponseException异常。 了解更多信息。

Question

在ASP.NET WebApi 2中,以下是什么区别:

    public async Task<IEnumerable<MyItem>> GetMyItems()
    {
        //... code ..., var myItems = await ...
        return myItems;
    }

    public async Task<IQueryable<MyItem>> GetMyItems()
    {
        //... code ..., var myItems = await ...
        return myItems;
    }

    public async Task<IHttpActionResult> GetMyItems()
    {
        //... code ..., var myItems = await ...
        return Ok(myItems);
    }

我应该返回IHttpActionResultIEnumerable<MyItem> / IQueryable<MyItem>