具有多个可选参数的搜索功能(客户端和API)

时间:2015-12-17 01:39:18

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

我对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个左右参数的过滤器显示项目列表,其中大多数是可选字段。 字段:名称,形状,颜色,签名,产品代码等。 大多数字段都可以为空,除了选定的几个字段是下拉列表。

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

这里的问题是我不知道如何将这么多参数从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]。

任何帮助?

1 个答案:

答案 0 :(得分:3)

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

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;
}

或检查查询所需参数并根据其值

进行过滤