2016-07-27 261 views
0

希望有人能夠解決我一直遇到的問題。 我已經創建了一個從數據庫中提取記錄的Web API。 我有以下職能到位,其工作確定:Web API,OData在GET操作中以多個參數傳遞

本地主機:8080/API /預算 - 返回所有預算

本地主機:8080/API /預算(799) - 返回所有合同799

我正在尋找的是能在兩個參數來傳遞,讓我做記錄calulations檢索,因此這樣的:

本地主機:8080/API/BUDG ets(799)/ 215 - 其中799是合同編號,215是物料編號。

這將允許我返回一個僅用於該預算的材料的數據集,然後可以對其進行計算。只有一個SQL表格包含合同編號和材料編號以及其他數字的加載。

這裏是我迄今爲止,但它似乎沒有奏效:

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

任何人都可以照如何可以做到這一點一些輕? 我只想將2個參數傳遞給來自url的函數。

此刻以下鏈接返回404: 本地主機:8080/API /預算(752230) 本地主機:8080/API /預算(ProjectNo = 752,ResourceCode = 230)

回答

0

你必須指定ODataRoute:

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

而第二個參數是字符串,所以你應該叫喜歡

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

如果你需要這樣的東西你不工作的網址,則需要結合這個功能,你的實體經濟,你就知道該怎麼做參考這個網頁:http://odata.github.io/WebApi/#04-06-function-parameter-support

+0

感謝您的幫助。將ODataRoute像你的評論一樣排序:) – McDuff

0

我不是100 %肯定在這個答案上,因爲我用OData有點不同,但我認爲原理還是一樣的;我認爲關鍵是第2個爲空的參數添加到您的第二Get函數...

//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... 

    } 
}