【问题标题】:Search function with multiple optional parameters (Client and API)具有多个可选参数(客户端和 API)的搜索功能
【发布时间】:2015-12-17 01:39:17
【问题描述】:

我对 API 和 MVC 比较陌生,而且我还在学习。通过检索(所有)数据、更新、添加和删除,我只完成了 Web API 和客户端 MVC(GET、PUT、POST、DEL)的基础知识。这是我的老师上课时使用的主要指南。 http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-1

我目前正在放假,正在独自探索。我遇到了一项任务,即通过大约 10 个参数的过滤器显示项目列表,其中大多数是可选字段。 字段:名称、形状、颜色、签名、产品代码等。 除了少数选定的下拉列表之外,大多数字段都可以为空。

大多数指南和教程会给我 1 的示例,或者可能是一些参数,但这项任务需要的不止这些。

这里的问题是我不知道如何将这么多参数从 MVC 客户端传递到 API。我已经阅读了很多其他可以将它们作为 URI 传递的解决方案

baseuri/action?a=&b=&c=1&d=example

但是我怎样才能忽略从未填充的空字段而只搜索数据库中实际填充的字段呢?

baseuri/action?a=&b=&c=1&d=example

//ignoring a and b
var result = from b in db.table where (c==1 && d==example)

我的老师提示我制作自己的控制器和函数,但我不太确定如何去做。

有些解决方案建议我使用 [FromURI],但搜索功能太复杂,我也不太清楚如何使用 [FromBody]。

有什么帮助吗?

【问题讨论】:

    标签: c# asp.net-mvc api asp.net-mvc-5 asp.net-web-api2


    【解决方案1】:

    要忽略空字段,您可以将参数设置为可为空并仅在它们具有值时对其进行过滤。例如:

    public IQueryable<Row> Action(string a, bool? b, int? c, string d)
    {
       var result = db.table.Where(e => true);
       if (a != null)
           result = result.Where(e => e.a == a);
       if (b.HasValue)
           result = result.Where(e => e.b == b.Value);
       if (c.HasValue)
           result = result.Where(e => e.c == c.Value);
       if (d != null)
           result = result.Where(e => e.d == d);
       return result;
    }
    

    作为 10 多个参数的解决方案,我可以提出如下建议:

    public IQueryable<Row> Action()
    {
      var result = db.table.Where(e => true);
      foreach(var parameter in HttpUtility.ParseQueryString(ActionContext.Request.RequestUri.Query).ToKeyValuePairs())
      {
        switch(parameter.Key)
        {
          case "a":
            result = result.Where(e => e.a == parameter.Value);
            break;
          case "b":
            result = result.Where(e => e.b == parameter.Value);
            break;
          ...
        }   
    
      }
      return result;
    }
    

    或检查所需参数的查询并根据其值进行过滤

    【讨论】:

    • 但不会因为我处理 10+ 左右的参数而导致效率低下吗?这个解决方案对于几个参数来说看起来不错,但对于 10 多个参数来说就不是那么好处理了。
    • 这种情况下,您可以使用ActionContext.Request.RequestUri.Query.ParseQueryString()System.Web.HttpUtility 中的扩展方法)来获取查询参数上的 NameValueCollection,并根据循环内的此值过滤结果
    • 我在回答中添加了示例,请查看
    • 虽然,对于案例“b”:result = result.Where(e => e.a == parameter.Value);休息;那应该是 e.b 而不是 e.a 吗?
    • 是的,对不起,我的错误
    猜你喜欢
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2015-11-13
    • 2018-01-27
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多