C# 如何将对象列表作为IHttpActionResult返回?
我是ASP.NET webapi新手,无法找到返回按id查询的对象列表的方法 这是GET请求的控制器方法。 我想返回所有通过url传递了指定questionnaireId的问题 我试过这个: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
// 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);
}