您如何满足 WebApi 查询字符串中的 AND 和 OR 搜索?
Posted
技术标签:
【中文标题】您如何满足 WebApi 查询字符串中的 AND 和 OR 搜索?【英文标题】:How do you cater for AND and OR searches in a WebApi query string? 【发布时间】:2019-08-17 01:02:33 【问题描述】:如何在 C# 中使用 Get 来满足 WebApi 查询字符串中的 AND 和 OR 搜索?
例如,对于诸如firstName=John OR firstName=Simon AND Country=UK OR Country=Canada OR LastName=Jones Or Age>=65
之类的搜索
【问题讨论】:
OData? @Damien_The_Unbeliever:你能说得更具体一点吗?您链接的网站上有很多信息;您基本上是在引用所有 OData。有关 OData 中相关细节的简要指南(代码示例的奖励积分)将很好地回答 OP 的问题。 您使用的是 EF 吗?我设法用System.Linq.Dynamic.Core
(github.com/StefH/System.Linq.Dynamic.Core) 做到了这一点
@Damien_The_Unbeliever 是对的,WebAPI 支持 OData,这将是最好的方法此链接提供有关如何设置 V3 WebApi 端点的信息docs.microsoft.com/en-us/aspnet/web-api/overview/…
更正我的评论,该文档提供了设置 OData V4 端点(以及 V3)的信息
【参考方案1】:
如果您想“正确地”支持这种查询,最好的做法是在您的 WebAPI2 控制器上启用 OData。
OData in ASP.NET Web API 文档提供了在 WebAPI 项目中配置 OData V4(也包括 V3)所需的所有信息,并提供了有关如何实现控制器操作的示例 (Supporting OData Query Options in ASP.NET Web API 2s)
从上面的链接我们可以看到下一个代码sn-p:
public class ProductsController : ApiController
[Queryable]
IQueryable<Product> Get()
使用实体框架时 Get() 实现的外观如何?
public class ProductsController : ApiController
[Queryable]
IQueryable<Product> Get()
var ef = new myDbContext();
return ef.Products; // <-- DbSet<Product>
查询字符串在查询此 WebAPI 端点时的外观如何?
https://[domain]/api/v1/Products?$filter=firstName eq 'john' or firstName eq 'Simon' and country eq 'UK'
与上面一样简单,因为 .Net OData 堆栈将开箱即用地解析 $filter(以及 OData 规范支持的任何其他查询字符串元素)并将查询(和其他)应用于 IQueryable对象本身
如果您没有使用 EF 或任何其他提供对 IQueryable 访问的系统,您可以拦截这种开箱即用的行为,并完全控制这种解析如何发生以使执行适应您的需求。
【讨论】:
以上是关于您如何满足 WebApi 查询字符串中的 AND 和 OR 搜索?的主要内容,如果未能解决你的问题,请参考以下文章