我是ASP.NET webapi的新手,我无法找到一种方法来返回由id查询的对象列表。
这是我的GET请求的控制器方法。 我想返回所有通过网址传递指定问卷的问题。
我试过了:
// 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;
}
这是我的问题类:
public class Question
{
public int Id { get; set; }
[ForeignKey("Questionnaire")]
public int QuestionnaireId { get; set; }
public string Text { get; set; }
public string ImageLink { get; set; }
public virtual Questionnaire Questionnaire { get; set; }
}
但在return questions
上显示编译错误:
无法将
System.Linq.IQueryable<finah_backend.Models.Question>
类型隐式转换为System.Web.Http.IHttpActionResult
。存在显式转换(您是否错过了演员?)
我想获得一份在QuestionireId上查询的JSON中返回的问题列表,该问题通过网址传递,即api / questions / 2 ==&gt;用问卷调查表IDI = 2给我回答所有问题。
答案 0 :(得分:12)
您使用[ResponseType]
属性,但仅用于生成文档,请参阅MSDN: ResponseTypeAttribute Class:
当声明的返回类型为HttpResponseMessage或IHttpActionResult时,使用此选项指定操作返回的实体类型。生成ApiDescription时,ApiExplorer将读取ResponseType。
您可以更改返回类型(并删除属性,因为不再需要该属性,因为将从实际签名生成返回类型文档):
public IEnumerable<Question> GetQuestion(int questionnaireId)
或者,如果您希望它是异步的:
public async Task<IEnumerable<Question>> GetQuestion(int questionnaireId)
或者将结果包装在方法IHttpActionResult
执行的Request.CreateResponse<T>()
中:
return Request.CreateResponse<IEnumerable<Question>>(HttpStatusCode.OK, questions);
如果您调用ApiController.Ok()
方法,则会为您完成后者:
return Ok(questions);
答案 1 :(得分:6)
只需简单地返回它,您需要使用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);
}
答案 2 :(得分:1)
首先,不要直接使用实体来提供数据。 为您的实体创建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();
}
我还建议使用JSON进行数据传输,因为使用Javascript非常容易。
答案 3 :(得分:0)
我认为您正在寻找类似下面的代码:
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;
}