2015-03-20 18 views
8

Tôi mới sử dụng ASP.NET webapi và tôi không thể tìm cách trả về danh sách các đối tượng được truy vấn bằng id.Làm thế nào để trả về một danh sách các đối tượng như một IHttpActionResult?

Đây là phương pháp điều khiển của tôi cho yêu cầu GET. Tôi muốn trả lại tất cả các câu hỏi có bảng câu hỏi được chỉ địnhId được truyền qua url.

Tôi cố gắng này:

// 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; 
} 

Đây là lớp Câu hỏi của tôi:

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; } 
    } 

Nhưng trên return questions nó hiển thị lỗi biên dịch:

Cannot implicitly convert type System.Linq.IQueryable<finah_backend.Models.Question> to System.Web.Http.IHttpActionResult . An explicit conversion exists (are you missing a cast?)

Tôi muốn có được một danh sách các câu hỏi được trả về trong JSON được truy vấn trên questionnaireId, được chuyển qua url tức là api/questions/2 ==> cung cấp tôi trở lại tất cả các câu hỏi với questionnaireId = 2.

+1

Lỗi lầm hoặc bạn có ngoại lệ gì không?Tôi nghĩ phương thức 'GetQuestion' của bạn sẽ không biên dịch do loại trả về không phù hợp với những gì bạn đã trả về thực sự. –

+0

Không thể chuyển đổi hoàn toàn loại 'System.Linq.IQueryable ' thành 'System.Web.Http.IHttpActionResult'. Một chuyển đổi rõ ràng tồn tại (bạn đang bỏ lỡ một diễn viên?) – Rick

Trả lời

11

Bạn đang sử dụng thuộc tính [ResponseType], nhưng đó là chỉ để tạo ra tài liệu, xem MSDN: ResponseTypeAttribute Class:

Use this to specify the entity type returned by an action when the declared return type is HttpResponseMessage or IHttpActionResult. The ResponseType will be read by ApiExplorer when generating ApiDescription.

Bạn có thể thay đổi kiểu trả về của bạn (và loại bỏ các thuộc tính, vì nó là không cần thiết nữa như tài liệu kiểu trả về sẽ được tạo ra từ các chữ ký thực tế):

public IEnumerable<Question> GetQuestion(int questionnaireId) 

Hoặc, nếu bạn muốn nó được async:

public async Task<IEnumerable<Question>> GetQuestion(int questionnaireId) 

Hoặc quấn kết quả trong một IHttpActionResult, mà phương pháp Request.CreateResponse<T>() làm:

return Request.CreateResponse<IEnumerable<Question>>(HttpStatusCode.OK, questions); 

Sau đó được thực hiện cho bạn nếu bạn gọi ApiController.Ok() phương pháp:

return Ok(questions); 
+0

Tôi đã thay đổi kiểu trả về thành 'public Task > GetQuestion (int questionnaireId)' nhưng tôi vẫn gặp lỗi: 'Không thể chuyển đổi hoàn toàn kiểu System.Linq.IQueryable thành 'System.Web. Http.IHttpActionResult '. Một chuyển đổi rõ ràng tồn tại (bạn có bỏ lỡ một diễn viên không?) ' – Rick

+0

@Fairbreath xem chỉnh sửa. Bạn đang trộn các cú pháp. Sử dụng 'public IEnumerable <>' hoặc 'public async Task >'. – CodeCaster

0

Tôi nghĩ rằng bạn đang tìm kiếm một số mã tương tự như dưới đây:

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; 
    } 
1

Trước hết không sử dụng các đơn vị trực tiếp cho việc cung cấp dữ liệu. Tạo một DTO cho các tổ chức của bạn:

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 
    } 
} 

Sau đó phương thức GET của bạn có thể trông như thế này:

// 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(); 
} 

tôi cũng khuyên bạn nên sử dụng JSON để truyền dữ liệu vì nó khá là dễ dàng để sử dụng với Javascript.

+0

Oh quên điều này, chỉ cần bọc câu trả lời của bạn trong một HttpResonseMessage. trả về Request.CreateResponse (HttpStatusCode.OK, đối tượng của bạn để trả lại); – Jazjef

6

Chỉ đơn giản là trả lại như điều này, bạn cần phải sử dụng một trong những phương pháp tốt đẹp mà ApiController bây giờ cung cấp.

Điều này sẽ trả lại mã trạng thái là 200 cùng với bộ sưu tập câu hỏi của bạn.

[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); 
} 
+1

_ "Không thể chuyển đổi hoàn toàn loại' System.Web.Http.Results.OkResult' thành 'System.Threading.Tasks.Task ' "_. OP thiếu công cụ sửa đổi 'async'. – CodeCaster

+0

Đã chỉnh sửa ... Tuy nhiên, điều đó có đáng để đánh giá không? – BenjaminPaul

+1

Có, khi cố gắng giải quyết lỗi trình biên dịch OP không được trợ giúp với lỗi trình biên dịch khác. Bạn cũng có thể muốn chỉ ra 'async' được thêm vào trong câu trả lời của bạn. – CodeCaster

Các vấn đề liên quan