C# 具有多个可选参数(客户端和API)的搜索函数

C# 具有多个可选参数(客户端和API)的搜索函数,c#,asp.net-mvc,api,asp.net-mvc-5,asp.net-web-api2,C#,Asp.net Mvc,Api,Asp.net Mvc 5,Asp.net Web Api2,我对API和MVC比较陌生,我还在学习。通过检索(所有)数据、更新、添加和删除,我只完成了WebAPI和客户端MVC(GET、PUT、POST、DEL)的基础知识。这是我老师上课的主要指南。 我目前正在学期休息,并且正在自己探索。我遇到过一个特定的任务,它是通过一个包含10个左右参数的过滤器来显示项目列表,其中大多数是可选字段。 字段:名称、形状、颜色、签名、产品代码等。 大多数字段都可以为空,只有少数字段是下拉列表 大多数指南和教程都会给出1的示例,或者一些参数,但这项任务需要的不仅仅是这些

我对API和MVC比较陌生,我还在学习。通过检索(所有)数据、更新、添加和删除,我只完成了WebAPI和客户端MVC(GET、PUT、POST、DEL)的基础知识。这是我老师上课的主要指南。

我目前正在学期休息,并且正在自己探索。我遇到过一个特定的任务,它是通过一个包含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]


有什么帮助吗?

要忽略空字段,您可以使参数为空,并仅在参数有值时按其过滤。例如:

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;
}
publicIQueryable操作(字符串a、bool?b、int?c、字符串d)
{
var result=db.table.Where(e=>true);
如果(a!=null)
结果=结果,其中(e=>e.a==a);
如果(b.HasValue)
结果=结果,其中(e=>e.b==b.Value);
if(c.HasValue)
结果=结果,其中(e=>e.c==c.Value);
如果(d!=null)
结果=结果,其中(e=>e.d==d);
返回结果;
}
作为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;
}
publicIQueryable操作()
{
var result=db.table.Where(e=>true);
foreach(HttpUtility.ParseQueryString(ActionContext.Request.RequestUri.Query.ToKeyValuePairs()中的var参数)
{
开关(参数键)
{
案例“a”:
结果=结果,其中(e=>e.a==参数值);
打破
案例“b”:
结果=结果,其中(e=>e.b==参数值);
打破
...
}   
}
返回结果;
}

或者检查所需参数的查询,并根据其值进行筛选

,但不会因为我处理的是10多个参数而超低效?对于一些参数,这个解决方案看起来不错,但对于10多个要处理的参数来说就不太好了。在这种情况下,您可以使用
ActionContext.Request.RequestUri.Query.ParseQueryString()
System.Web.HttpUtility
中的扩展方法)要获取查询参数的NameValueCollection,并根据循环中的这些值筛选结果,我在答案中添加了示例,请查看案例“b”:result=result.Where(e=>e.a==parameter.Value);打破那应该是e.b而不是e.a吗?是的,对不起,我错了