2016-07-27 21 views
0

誰かが私が持っていた問題を克服することができます。 データベースからレコードをフェッチするWeb APIを作成しました。 私は場所での作業、[OK]を、次の機能があります。Web API、OData GET操作で複数のパラメータを渡す

はlocalhost:8080/API /予算を - 格安ホテル

localhostを返します:8080/API /予算(799)を - すべて返します。

はlocalhost:8080/API/Budg契約のために私が探している何799

は私が何かのようなので、取得したレコードにcalulationsを行うことができるように、二つのパラメータを渡すことができるようにすることですets(799)/ 215 - 799は契約番号、215は品目番号です。

これにより、計算に使用できる予算の材料のみのデータセットを返すことができます。これには、契約番号と品目番号の両方と、他の数値のロードを含むSQLテーブルが1つだけあります。

は、ここで私がこれまで持っているものだが、それが働いているように見えるdoesntの:

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

誰もこれを行うことができますどのようにいくつかの光を当てることができますか? URLから関数に2つのパラメータを渡したいだけです。現時点で

次のリンクを返す404: はlocalhost:8080/API /予算(752230) はlocalhost:8080/API /予算(ProjectNo = 752、ResourceCode = 230)

答えて

0

...キーはあなたの第二Get関数に2番目のNULL可能パラメータを追加することであると信じて

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

あなたは、働いていないURLのようなものが必要な場合は、あなたがあなたのエンティティ予算にこの関数をバインド、あなたがこのページを参照してください。それを行う方法を知っている必要があります。http://odata.github.io/WebApi/#04-06-function-parameter-support

+0

ありがとうございました。あなたのコメントのようなODataRouteをアサインすると:) – McDuff

0

私は100ありませんよ私はODataを少し違って使用しているので、この回答には確信していますが、原則は同じです。

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

2番目のパラメータは文字列で、あなたのよう呼び出す必要がありますので:私はあなたがODataRouteを指定している

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

    } 
} 
関連する問題