无法将类型'System.Web.Http.Results.NotFoundResult'隐式转换为'System.Collections.Generic.IEnumerable< ....>'

时间:2015-07-06 19:58:23

标签: c# asp.net asp.net-web-api

如果没有找到行,如何返回404?但是,以下代码在行return NotFound()上收到错误。

  

错误1无法将类型'System.Web.Http.Results.NotFoundResult'隐式转换为'System.Collections.Generic.IEnumerable< webapi.Models.Product>”。存在显式转换(您是否错过了演员?)

    public IEnumerable<Product> GetProductsByReportId(int rid)
    {
        using (var db = new MyContext())
        {
            var query = from b in db.table where b.rid == rid select b;
            if (query == null)
            {
                return NotFound(); // Error!
            }
            return query.ToList();
        }
    }

2 个答案:

答案 0 :(得分:2)

您无法将 System.Web.Http.Results.NotFoundResult 设置/转换为产品

当GetProductsByReportId的结果为空时,您必须修改调用方法以返回404(或消息)。

public IEnumerable<Product> GetProductsByReportId(int rid)
    {
        using (var db = new MyContext())
        {
            var query = from b in db.table where b.rid == rid select b;
            if (query == null)
            {
                return null;
            }
            return query.ToList();
        }
    }

int id = 1;
List<Product> products = GetProductsByReportId(id);
if(products == null) {
    var message = string.Format("Product with id = {0} not found", id);
    HttpError err = new HttpError(message);
    return Request.CreateResponse(HttpStatusCode.NotFound, err);
}

答案 1 :(得分:1)

错误消息说明了一切。

当您的方法签名返回System.Web.Http.Results.NotFoundResult

时,您尝试返回对象IEnumerable<Product>

你可以做的一件事是:

if (query == null)
     return null;

然后在调用此方法的代码中,处理列表为空的事实。

正如您在标签中提到的,asp.net Web api,您可以在控制器中执行类似的操作(假设您的控制器正在返回HttpResponseMessage):

[HttpGet]
public HttpResponseMessage GetProducts(int id)
{
    var prods = GetProductsByReportId(id);
    if (prods == null)             
       return Request.CreateResponse(HttpStatusCode.NotFound);
    else
        return Request.CreateResponse(HttpStatusCode.OK, prods);
}