如何在Web API查询字符串中将多个参数作为OR处理?

时间:2017-07-26 20:53:12

标签: c# asp.net-web-api .net-4.5

假设我有这个网址:

api.XXX.com/cities?risk=a,b&rating=x,y

我想要的是风险类别为A或B且评级为X或Y的城市列表。我应该如何实施?

我知道我可以获得风险和评级键的值,但接着是什么?是否最好简单地解析字符串并使用switch语句?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

更标准的方法是:

api.XXX.com/cities?risks=a&risks=b&ratings=x&ratings=y

这可以通过类似这样的控制器动作来处理:

[HttpGet]
public async Task<IHttpActionResult> SearchCities(
    List<string> risks,
    List<string> ratings)
{
    var results = this.dbContext.Cities.AsQueryable();
    if(risks.Any()) 
    {
        results = results.Where(c => c.Risks.Any(cr => risks.Contains(cr.Code));
    }
    if(ratings.Any())
    {
        results = results.Where(c => ratings.Contains(c.Rating));
    }
    ...
}

类似的回答here

答案 1 :(得分:0)

我建议创建一个POCO来表示此端点将接收的选项:

public class CitySearchOptions
{
   public List<string> Risk { get; set; }
   public List<string> Rating { get; set; }
}

然后,您可以使用控制器签名中的[FromUri]属性将查询字符串自动反序列化到POCO中。从那里,您可以轻松实现逻辑以对接收到的值进行操作。

public async Task<IHttpActionResult> SearchCities([FromUri] CitySearchOptions options)

请注意,上面是伪代码,如果没有对查询字符串格式进行一些调整,可能无法解决您的问题。 This question建议对于基于列表的查询参数,您应该更喜欢这样的格式:

/cities?risk=a&risk=b&rating=x&rating=y