2016-07-27 23 views
0

Ich hoffe, jemand kann mit einem Problem, das ich habe, hepl. Ich habe eine Web-API erstellt, die Datensätze aus der Datenbank abruft. Ich habe folgende Funktionen vorhanden, die Arbeit ok:Web-API, OData Übergabe mehrerer Parameter in GET-Operation

localhost: 8080/api/Budget - Gibt allen Haushalt

localhost: 8080/api/Budget (799) - alle Kosten für Vertrags 799

Was ich suche ist in der Lage sein, in zwei Parameter zu übergeben, mir zu erlauben Berechnungen am auf die Datensätze abgerufen so etwas wie zu tun:

localhost: 8080/api/Budg ets (799)/215 - Wobei 799 die Vertragsnummer und 215 eine Materialnummer ist.

Dies wird mir erlauben, einen Datensatz von nur Materialien für dieses Budget zurückgeben, dass ich dann Berechnungen ausführen kann. Es gibt nur eine SQL-Tabelle, die sowohl die Vertragsnummer und die Materialnummer als auch eine Ladung anderer Zahlen enthält.

Hier ist, was ich bisher, aber es funktioniert nicht zu sein scheinen arbeiten:

public IHttpActionResult Get() 
    { 
     return Ok(context.Budgets); 
    } 

    public IHttpActionResult Get([FromODataUri] int key) 
    { 
     var budgets = context.Budgets.FirstOrDefault(p => p.ProjectNo == key); 
     if (budgets == null) 
     { 
      return NotFound(); 
     } 
     return Ok(budgets); 
    } 

[ODataRoute("GetMaterialUsage(ProjectId={ProjectId},ResourceCode={ResourceCode})")] 
     public IHttpActionResult GetMaterialUsage([FromODataUri] int ProjectId, [FromODataUri] string ResourceCode) 
     { 
      var budgets = context.Budgets.FirstOrDefault(p => p.ProjectNo == ProjectId && p.ResourceCode == ResourceCode); 
      if (budgets == null) 
      { 
       return NotFound(); 
      } 
      return Ok(budgets); 
     } 

WebApiConfig:

  ODataModelBuilder builder = new ODataConventionModelBuilder(); 

     // Web API configuration and services 
     builder.EntitySet<BudgetTypes>("BudgetTypes"); 
     builder.EntitySet<Budgets>("Budgets"); 
     var function = builder.Function("GetMaterialUsage"); 
     function.Parameter<int>("ProjectId"); 
     function.Parameter<string>("ResourceCode"); 
     function.ReturnsCollectionFromEntitySet<Budgets>("Budgets"); 


     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.MapODataServiceRoute(
      routeName: "ODataRoute", 
      routePrefix: "api", 
      model: builder.GetEdmModel() 
     ); 

Kann jemand etwas Licht leuchten auf, wie dies getan werden kann? Ich möchte nur 2 Parameter an eine Funktion von der URL übergeben.

Im Moment kehren die folgenden Links 404: localhost: 8080/api/Budget (752.230) localhost: 8080/api/Budget (ProjectNo = 752, ResourceCode = 230)

Antwort

0

Sie die ODataRoute angeben:

[ODataRoute("GetMaterialUsage(ProjectId={ProjectId},ResourceCode={ResourceCode})")] 

und zweite Parameter ist string, so rufen Sie sollte wie

localhost:8080/api/GetMaterialUsage(ProjectNo=752,ResourceCode='230') 

Wenn Sie so etwas wie Ihre nicht-arbeit uRL, müssen Sie diese Funktion, um Ihr Unternehmen Budget gebunden, werden Sie wissen, wie es zu dieser Seite finden Sie tun: http://odata.github.io/WebApi/#04-06-function-parameter-support

+0

Danke für die Hilfe. Assing die ODataRoute wie dein Kommentar sortiert es :) – McDuff

0

Ich bin nicht 100 % sicher bei dieser Antwort, weil ich OData etwas anders benutzt habe, aber ich denke das Prinzip ist immer noch das gleiche; Ich glaube, der Schlüssel ist, eine zweite Nullable-Parameter auf Ihre zweite Get-Funktion hinzuzufügen ...

//try: localhost:8080/api/Budgets(799,251) 
//use this in-place of your second get function 
//note the nullable (optional) 2nd parameter 
public IHttpActionResult Get([FromODataUri] int key, [FromODataUri] int? key2 = null) 
{ 
    if (key2 == null) 
    { 
     //carry-on as usual using the 1-param code 
     var budgets = context.Budgets.FirstOrDefault(p => p.ProjectNo == key); 
     if (budgets == null) 
     { 
      return NotFound(); 
     } 
     return Ok(budgets); 
    } 
    else 
    { 
     //if a second param is also supplied... 

    } 
}