2014-07-07 12 views
14

Ist es möglich, OData zu folgenden Aufgaben zu erhalten? Ich möchte in der Lage sein, einen REST-Aufruf abzufragen, indem ich Parameter übergebe, die möglicherweise nicht der Primärschlüssel sind. Kann ich eine REST-Methode wie ->GetReports(22, 2014) oder Reports(22, 2014) aufrufen?Web-API und OData- Pass mehrere Parameter

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

Hier ist meine letzte Änderung.

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

meine Methode für Controller 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()); 

      } 

Ich mag die URL versucht Aufruf:

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

Keine HTTP-Ressource gefunden wurde, dass die Anforderung URI 'entspricht http://localhost:6064/odata/Reports(key%3D5%2Cyear%3D2014)/ListReports' .`

Antwort

23

Sie können einen Funktionsimport namens GetReports mit zwei Parametern definieren.

(Hinweis: der Name der Funktion Import nicht das gleiche mit Entität Satzname sein kann)

Ihre EDM-Modell konfigurieren:

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

Und dann Ihre Methode schreiben wie:

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

Dann wird die Anfrage

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

wird funktionieren.

+0

Wie kann dies mit Odatav3 getan werden? v3 hat keine Funktion. – Keith

+0

Ich muss Odata v3 verwenden, weil ich Jaydata verwende und es nur mit v3 funktioniert. Wenn ich Jaydata mit Odata v4 verwende, wird ein 404-Fehler ausgelöst. Irgendeine Lösung mit v3? Danke – Keith

+1

Mit v3 können Sie eine Aktion definieren. Wenn Sie eine ungebundene Aktion definieren, müssen Sie HttpPost verwenden und die Parameter über den Anforderungshauptteil übergeben, und Sie müssen eine Methode "HandleUnmappedRequest" im Controller hinzufügen, um die Anforderung für ungebundene Aktionen zu erfüllen. Wenn Sie es als gebundene Aktion definieren, die an Entitätsmenge gebunden ist, obwohl dies keinen Sinn ergibt, können Sie eine Methode "[ActionName] OnCollectioinOf [EntityTypeName]" hinzufügen und HttpPost "~/[EntitySetName]/[ActionName]" aufrufen und Übergeben Sie die Parameter im Anfragetext. –