c# - 您如何满足 WebApi 查询字符串中的 AND 和 OR 搜索?

标签 c# .net asp.net-web-api .net-core

如何在 C# 中使用 Get 在 WebApi 查询字符串中进行 AND 和 OR 搜索?

例如,搜索 firstName=John OR firstName=Simon AND Country=UK OR Country=Canada OR LastName=Jones Or Age>=65

最佳答案

如果您想“正确地”支持这种查询,最好的做法是在您的 WebAPI2 Controller 上启用 OData。

OData in ASP.NET Web API文档提供了在 WebAPI 项目中配置 OData V4(以及 V3)所需的所有信息,并提供了有关如何实现 Controller 操作的示例(Supporting OData Query Options in ASP.NET Web API 2 s)

从上面的链接我们可以看到下一个代码片段:

public class ProductsController : ApiController
{
    [Queryable]
    IQueryable<Product> Get() {}
}

当您使用 Entity Framework 时,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 的访问的任何其他系统,您可以拦截这种开箱即用的行为并完全控制这种解析发生的方式以使执行适应您的需要。

关于c# - 您如何满足 WebApi 查询字符串中的 AND 和 OR 搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55360656/

相关文章:

c# - Cosmos DB - CreateDocumentQuery 不反序列化抽象类型

c# - 将 C# 泛型类型作为参数传递

C#对许多相对较大的对象进行垃圾回收

c# - Controller 中操作的路径模板不是有效的 OData 路径模板

c# - 如何在 Windows Phone Mango 中订阅以获取 ShareLinkTask 通知?

c# - 在 Ruby 中,什么相当于 C# 中的接口(interface)?

c# - 如何在 python 中加载 C# dll?

.net - 如何使列表框刷新其项目文本?

c# - 检测到客户端已关闭连接

c# - 在 StartUp 中使用 Autofac 解决每个用户/每个请求的依赖