2014-07-07 27 views
14

Aşağıdakileri yapmak için OData almak mümkün mü? Bir REST çağrısını, birincil anahtar olmamasına göre parametrelerden geçirerek sorgulayabilmek istiyorum. ->GetReports(22, 2014) veya Reports(22, 2014) gibi bir REST yöntemini çağırabilir miyim?Web API ve Birden Çok Parametreyi OData- Geçiş

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

İşte son değişikliktir. İstek URI'si 'http://localhost:6064/odata/Reports(key%3D5%2Cyear%3D2014)/ListReports' maçları Hiçbir HTTP kaynak bulunamadı

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

: Ben gibi url arama çalıştı 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()); 

      } 

denetleyicisi için

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

benim yöntem .

cevap

23

İki parametresi olan GetReports adlı bir işlev içe aktarma tanımlayabilirsiniz.

(Not: işlev ithalat ismi varlık belirlenen adıyla aynı olamaz): yönteminizi olarak yazma

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

Sonra

olarak EDM modeli yapılandırın:

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

Sonra istek

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

çalışacaktır.

+0

Odatav3 ile bu nasıl yapılabilir? v3 bir işlevi yoktur. – Keith

+0

Odata v3'ü kullanmam gerekiyor çünkü Jaydata kullanıyorum ve sadece v3 ile çalışmak. Jaydata'yı Odata v4 ile kullanırsam 404 hatası verir. V3 ile herhangi bir çözüm? Teşekkürler – Keith

+1

v3 ile bir eylem tanımlayabilirsiniz. Bağlanmayan bir eylem tanımlarsanız, HttpPost'u kullanmanız ve parametreleri istek gövdesinden geçirmeniz gerekir ve denetleyicide ilişkisiz eylem isteğini eşleştirmek için "HandleUnmappedRequest" yöntemini eklemeniz gerekir. Bu, anlamlı olmamasına rağmen, varlık kümesine bağlı bir bağlı eylem olarak tanımlarsanız, "[ActionName] OnCollectioinOf [EntityTypeName]" yöntemini ekleyebilir ve HttpPost "~/[EntitySetName]/[ActionName]" öğesini arayabilir ve İstek gövdesindeki parametreleri ilet. –

İlgili konular