2014-07-07 28 views
14

Có thể nhận OData để thực hiện những điều sau không? Tôi muốn có thể truy vấn một cuộc gọi REST bằng cách truyền các tham số hơn có thể không phải là khóa chính. Tôi có thể gọi phương thức REST như ->GetReports(22, 2014) hoặc Reports(22, 2014) không?API Web và OData- Vượt qua nhiều thông số

[HttpGet] 
[ODataRoute("Reports(Id={Id}, Year={Year})")] 
public IHttpActionResult GetReports([FromODataUri]int Id, [FromODataUri]int Year) 
{ 
    return Ok(_reportsRepository.GetReports(Id, Year)); 
} 

Đây là sự thay đổi mới nhất của tôi.

//Unbound Action OData v3 
     var action = builder.Action("ListReports"); 
     action.Parameter<int>("key"); 
     action.Parameter<int>("year"); 
     action.ReturnsCollectionFromEntitySet<Report>("Reports"); 

phương pháp của tôi cho điều khiển ReportsController

[HttpPost] 
      [EnableQuery] 
      public IHttpActionResult ListReports([FromODataUri] int key, ODataActionParameters parameters) 

      { 

       if (!ModelState.IsValid) 
       { 
        throw new HttpResponseException(HttpStatusCode.BadRequest); 
       } 


       int year = (int)parameters["year"]; 
       return Ok(_reportsRepository.GetReports(key, year).Single()); 

      } 

tôi đã cố gắng gọi url như:

http://localhost:6064/odata/Reports(key=5,year=2014)/ListReports 

Không tài nguyên HTTP đã được tìm thấy phù hợp với yêu cầu URI 'http://localhost:6064/odata/Reports(key%3D5%2Cyear%3D2014)/ListReports' .`

Trả lời

23

Bạn có thể xác định nhập hàm có tên GetReports có hai tham số.

(Lưu ý: tên của nhập khẩu chức năng không thể giống với thực thể đặt tên)

Cấu hình mô hình EDM của bạn như:

 var builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<Report>("Reports"); 
     var function = builder.Function("GetReports"); 
     function.Parameter<int>("Id"); 
     function.Parameter<int>("Year"); 
     function.ReturnsCollectionFromEntitySet<Report>("Reports"); 
     var model = builder.GetEdmModel(); 

Và sau đó viết phương pháp của bạn như:

 [HttpGet] 
     [ODataRoute("GetReports(Id={Id},Year={Year})")] 
     public IHttpActionResult WhateverName([FromODataUri]int Id, [FromODataUri]int Year) 
     { 
      return Ok(_reportsRepository.GetReports(Id, Year)); 
     } 

Sau đó, theo yêu cầu

Get ~/GetReports(Id=22,Year=2014) 

sẽ hoạt động.

+0

Làm thế nào điều này có thể được thực hiện với Odatav3? v3 không có chức năng. – Keith

+0

Tôi phải sử dụng Odata v3 vì tôi đang sử dụng Jaydata và nó chỉ hoạt động với v3. Nếu tôi sử dụng Jaydata với Odata v4 nó sẽ gây ra lỗi 404. Bất kỳ giải pháp với v3? Cảm ơn – Keith

+1

Với v3, bạn có thể xác định một hành động. Nếu bạn định nghĩa một hành động không ràng buộc, bạn phải sử dụng HttpPost và chuyển các tham số thông qua phần thân yêu cầu, và bạn cần thêm một phương thức "HandleUnmappedRequest" trong bộ điều khiển để khớp với yêu cầu hành động không liên kết. Nếu bạn định nghĩa nó như là một hành động bị ràng buộc ràng buộc với thực thể thiết lập mặc dù điều này không có ý nghĩa, bạn có thể thêm một phương thức "[ActionName] OnCollectioinOf [EntityTypeName]" và gọi HttpPost "~/[EntitySetName]/[ActionName]", và chuyển các tham số trong phần thân yêu cầu. –

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