您如何满足 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 搜索?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别