2016-07-27 263 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... 

    } 
}