【问题标题】:Web API, OData Passing in multiple parameters in GET operationWeb API、OData GET 操作中传入多个参数
【发布时间】:2016-07-27 19:13:02
【问题描述】:

希望有人可以帮助解决我一直遇到的问题。 我创建了一个从数据库中获取记录的 Web API。 我有以下功能可以正常工作:

localhost:8080/api/Budgets -- 返回所有预算

localhost:8080/api/Budgets(799) -- 返回所有合约 799

我正在寻找的是能够传入两个参数以允许我对检索到的记录进行计算,例如:

localhost:8080/api/Budgets(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/预算(752,230) localhost:8080/api/Budgets(ProjectNo=752,ResourceCode=230)

【问题讨论】:

    标签: controller asp.net-web-api2 odata


    【解决方案1】:

    您已指定 ODataRoute:

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

    第二个参数是字符串,所以你应该像这样调用

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

    如果您需要类似不起作用的 url,您需要将此功能绑定到您的实体预算,您将知道如何操作,请参阅此页面:http://odata.github.io/WebApi/#04-06-function-parameter-support

    【讨论】:

    • 感谢您的帮助。像您的评论一样评估 ODataRoute :)
    【解决方案2】:

    我不能 100% 确定这个答案,因为我使用 OData 的方式略有不同,但我认为原理还是一样的;我相信关键是在您的第二个 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...
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-28
      • 2013-01-30
      • 1970-01-01
      • 2014-09-14
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多