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

How do I handle multiple parameters as an OR in a Web API querystring?

假设我有这个 URL:

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

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

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

我建议创建一个 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

更标准的方法是:

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