C# 如何将对象列表作为IHttpActionResult返回?

C# 如何将对象列表作为IHttpActionResult返回?,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我是ASP.NET webapi新手,无法找到返回按id查询的对象列表的方法 这是GET请求的控制器方法。 我想返回所有通过url传递了指定questionnaireId的问题 我试过这个: // GET: api/Questions/5 [ResponseType(typeof(List<Question>))] public Task<IHttpActionResult> GetQuestion(int questionnaireId) { var quest

我是ASP.NET webapi新手,无法找到返回按id查询的对象列表的方法

这是GET请求的控制器方法。 我想返回所有通过url传递了指定questionnaireId的问题

我试过这个:

// GET: api/Questions/5
[ResponseType(typeof(List<Question>))]
public Task<IHttpActionResult> GetQuestion(int questionnaireId)
{
    var questions = from q in db.Questions
    where q.QuestionnaireId == questionnaireId
    select new Question()
    {
            Id = q.Id,
            ImageLink = q.ImageLink,
            QuestionnaireId = q.QuestionnaireId,
            Text = q.Text
    };
    return questions;
}
但是在
返回问题上
显示编译器错误:


无法将类型
System.Linq.IQueryable
隐式转换为
System.Web.Http.IHttpActionResult
。存在显式转换(是否缺少强制转换?)


我想获得一个在questionnaireId上查询的JSON返回的问题列表,该列表通过url传递,即api/questions/2==>返回questionnaireId=2的所有问题。

我想您正在寻找类似以下代码:

public IEnumerable<Question> Get(int id)
    {
        //Create the list that you need to return here
        // I am creating a new list and adding an object below just for 
        // explaining the idea.

        var questions = new List<Question>();
        questions.Add(new Question());
        return questions;
    }
public IEnumerable Get(int-id)
{
//创建您需要在此处返回的列表
//我正在创建一个新列表,并在下面添加一个对象,仅用于
//解释这个想法。
var questions=新列表();
添加(新问题());
回答问题;
}

首先,不要直接使用实体提供数据。 为实体创建DTO:

public class QuestionDto
{

  public int id {get; set;}
  //put here getter and setter for all other Question attributes you want to have

  public QuestionDto(Question question){
    this.id = question.id;
    ... and so on
  }
}
然后,GET方法可以如下所示:

// GET: api/Questions/5
public List<QuestionDto> GetQuestion(int questionnaireId)
{
    IEnumerable<QuestionDto> questions = from q in db.Questions
    where q.QuestionnaireId == questionnaireId
    select new QuestionDto(q);
    return questions.toList();
}
//GET:api/Questions/5
公共列表GetQuestion(int questionnaireId)
{
IEnumerable questions=从q开始,以db.questions为单位
其中q.QuestionnaireId==QuestionnaireId
选择新问题(q);
返回问题。toList();
}

我还建议使用JSON进行数据传输,因为它很容易与Javascript一起使用。

您使用的是
[ResponseType]
属性,但这仅用于生成文档,请参阅:

当声明的返回类型为HttpResponseMessage或IHttpActionResult时,使用此选项指定操作返回的实体类型。生成ApiDescription时,ApiExplorer将读取ResponseType

您可以更改返回类型(并删除该属性,因为它不再是必需的,因为返回类型文档将从实际签名生成):

如果调用
ApiController.Ok()

return Ok(questions);

只需像这样简单地返回它,您需要使用ApiController现在提供的一种很好的方法

这将返回状态代码200以及您的问题集合

[ResponseType(typeof(List<Question>))]
public async Task<IHttpActionResult> GetQuestion(int questionnaireId)
{
    var questions = from q in db.Questions
    where q.QuestionnaireId == questionnaireId
    select new Question()
    {
            Id = q.Id,
            ImageLink = q.ImageLink,
            QuestionnaireId = q.QuestionnaireId,
            Text = q.Text
    };
    return this.Ok(questions);
}
[ResponseType(typeof(List))]
公共异步任务GetQuestion(int questionnaireId)
{
var问题=以db为单位的q中的问题
其中q.QuestionnaireId==QuestionnaireId
选择新问题()
{
Id=q.Id,
ImageLink=q.ImageLink,
QuestionnaireId=q.QuestionnaireId,
Text=q.Text
};
返回此。确定(问题);
}

什么是错误或您是否遇到任何异常?我认为您的方法
GetQuestion
无法编译,因为返回类型与您实际返回的不匹配。无法将类型“System.Linq.IQueryable”隐式转换为“System.Web.Http.IHttpActionResult”。存在显式转换(是否缺少强制转换?)我将返回类型更改为
public Task GetQuestion(int questionnaireId)
,但仍然得到错误:
无法隐式将type System.Linq.IQueryable转换为'System.Web.Http.IHttpActionResult'。存在显式转换(是否缺少转换?
@Fairbreath请参见编辑。你把语法搞混了。使用
public IEnumerable
public async Task
。为什么要使方法异步。它不等待任何东西。这些答案无效。“无法将类型
System.Web.Http.Results.OkResult
隐式转换为
System.Threading.Tasks.Task
”。OP缺少
async
修饰符。是的,在尝试解决编译器错误时,OP没有得到另一个编译器错误的帮助。您可能还想指出答案中添加的
async
。@Fairbreath。。这听起来像是一个完全不同的问题?请另外问一个问题。@Fairbreath与错误“无法将类型System.Linq.IQueryable隐式转换为System.Web.Http.IHttpActionResult。存在显式转换(是否缺少转换?)”无关,这是我的答案所解决的问题。请编辑您的问题,现在还不清楚你在问什么。哦,忘了这一个吧,把你的答案写在一条httpresonse消息中就行了。return Request.CreateResponse(HttpStatusCode.OK,您要返回的对象);
public async Task<IEnumerable<Question>> GetQuestion(int questionnaireId)
 return Request.CreateResponse<IEnumerable<Question>>(HttpStatusCode.OK, questions);
return Ok(questions);
[ResponseType(typeof(List<Question>))]
public async Task<IHttpActionResult> GetQuestion(int questionnaireId)
{
    var questions = from q in db.Questions
    where q.QuestionnaireId == questionnaireId
    select new Question()
    {
            Id = q.Id,
            ImageLink = q.ImageLink,
            QuestionnaireId = q.QuestionnaireId,
            Text = q.Text
    };
    return this.Ok(questions);
}