前言

过滤和查询感觉是一个样子,实际上是不同含义。查询是查询一个主体,如果说要查询全部男职工但是名字中带良的,全部男职工 就是主体要查询的对象,然后名字中带良的表示的是过滤。

那么什么是搜索呢?搜索是模糊查找。

其实不用分的那么清楚,因为查询和过滤还有搜索往往是在一起的,没有查询就没有过滤,当然没有过滤的查询往往是没有意义的,也就是达不到需求的,好的,直接进入正文。

正文

在前文中说过,如果是查询enployee(子资源)的话,那么是子资源,那么格式是companies/(companyId)/employees/employeeId 这种模式,同样这里也是通过父资源的查询和过滤还有子资源的查询和过滤来介绍。

父资源

public async Task<IEnumerable<Company>> GetCompaniesAsync(CompanyDtoParameters parameters)
{
if (parameters == null)
{
throw new ArgumentNullException(nameof(parameters));
} var queryExpression = _context.Companies as IQueryable<Company>; if (!string.IsNullOrWhiteSpace(parameters.CompanyName))
{
parameters.CompanyName = parameters.CompanyName.Trim();
queryExpression = queryExpression.Where(x => x.Name == parameters.CompanyName);
} if (!string.IsNullOrWhiteSpace(parameters.SearchTerm))
{
parameters.SearchTerm = parameters.SearchTerm.Trim();
queryExpression = queryExpression.Where(x => x.Name.Contains(parameters.SearchTerm) ||
x.Introduction.Contains(parameters.SearchTerm));
}
return await queryExpression.ToListAsync();
}

这里面有个不起眼的关键点:var queryExpression = _context.Companies as IQueryable; 为什么要这么做呢?

这个是为了我们链式处理,代码的优雅性。因为_context.Companies 在where 之后返回的是IQueryable,那么和_context.Companies不是同一种类型,而_context.Companies 实现了IQueryable,所以可以做一个转换。

其他就是一些简单的操作,查询公司名,然后模糊搜索。这里面也有一个小技巧,就是模糊的东西写在后面,因为这样可以先过滤一大半,有助于效率。

子资源

如下:

public async Task<IEnumerable<Employee>> GetEmployeesAsync(Guid companyId,
EmployeeDtoParameters parameters)
{
if (companyId == Guid.Empty)
{
throw new ArgumentNullException(nameof(companyId));
} var items = _context.Employees.Where(x => x.CompanyId == companyId); if (!string.IsNullOrWhiteSpace(parameters.Gender))
{
parameters.Gender = parameters.Gender.Trim();
var gender = Enum.Parse<Gender>(parameters.Gender); items = items.Where(x => x.Gender == gender);
} if (!string.IsNullOrWhiteSpace(parameters.Q))
{
parameters.Q = parameters.Q.Trim(); items = items.Where(x => x.EmployeeNo.Contains(parameters.Q)
|| x.FirstName.Contains(parameters.Q)
|| x.LastName.Contains(parameters.Q));
} return await items.ToListAsync();
}

这个比较简单,就不介绍了。

然后补充一点,就是如果参数变化多的,最好写在一个类中,因为这样参数就是这个类,比如说查询搜索这种很有可能会增加一个参数,那么这样方法的接口就好产生变化,这也是为什么我们看到控制器action的参数一般是类的缘故。

下一节分页

RestfulApi 学习笔记——查询与过滤还有搜索(五)的更多相关文章

  1. 【转】MongoDB学习笔记(查询)

    原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...

  2. Anatomy of a Database System学习笔记 - 查询

    查询解析 解析会生成一个查询的内部展示.格式检查包含在解析过程中. 每次解析一个SELECT,步骤如下:1. 从FROM里找到表名,转换成schema.tablename.这一步需要调用目录管理器ca ...

  3. Solr学习笔记——查询

    1.进入Solr管理界面http://localhost:8983/solr/ 可以看到Query中有若干的参数,其意义如下(参考:http://www.jianshu.com/p/3c4cae5de ...

  4. 《A Tour of PostgreSQL Internals》学习笔记——查询处理分析

           终于要迎来postgresql的<A Tour of PostgreSQL Internals>系列的最后一篇了.学习是不能拖延的事儿,越拖延事情越多.不废话,一起来看看吧~ ...

  5. Linux学习笔记(8)文件搜索与帮助

    帮助: (1) man ls (2) info  ls  (3) whatis ls  (4) help 搜索: (1) which  ls :查看ls命令所在绝对路径 (2) locate user ...

  6. 【Python学习笔记六】获取百度搜索结果以及百度返回“百度安全验证”问题解决

    1.获取百度搜索结果页面主要是修改百度搜索url中的参数实现,例如查询的关键字为wd: 举例:https://www.baidu.com/s?wd=python",这样就可以查询到‘pyth ...

  7. MongoDB学习笔记-查询

    MongoDB中使用find或findOne函数执行查询 find函数 db.c.find()--查询集合c所有 db.c.find({“name”:”zhangsan”}) 注意:查询条件的值必须是 ...

  8. ZendFramework2学习笔记 表单过滤、表单验证

    ZF2有非常多内建的Filter和Validator组件,能够方便地对表单数据进行处理. Filter的作用是过滤表单数据.比如,去除一些空格,替换一些敏感词等. Validator的作用是检验表单数 ...

  9. jQuery学习笔记之可见性过滤选择器

    可见性过滤选择器是根据元素的可见和不可见状态来选择相应的元素. 显示隐藏的例子: <!DOCTYPE html> <html> <head> <script ...

  10. Spring Security 学习笔记-securityContext过滤器过滤链学习

    web.xml配置委托代理filter,filter-name默认与filter bean的名字保持一致. <filter> <filter-name>springSecuri ...

随机推荐

  1. java.util.Arrays 快速学习教程

    在 Java 中,java.util.Arrays类提供的多种数组操作功能,可以有效地执行各种数组相关的操作,使得数组处理变得简单和高效. 打印数组 String[] arr = new String ...

  2. sentinel的见解

    Sentinel 是面向分布式.多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量控制.熔断降级.热点流量防护等多个维度来帮助开发者保障微服务的稳定性.   在 Sentinel 里面,所 ...

  3. vue3,实战项目随心笔记

    本项目模仿bibi 网站,主要是做一个pc和手机端的应用案例,主要涉及支付,三方登陆,css原子,妹子ui,路由缓存,组件封装,tailwindcss,vueuse 等常见企业级术应用, 由于本项目是 ...

  4. RocketMQ为什么这么快?我从源码中扒出了10个原因!

    大家好,我是三友~~ RocketMQ作为阿里开源的消息中间件,深受广大开发者的喜爱 而这其中一个很重要原因就是,它处理消息和拉取消息的速度非常快 那么,问题来了,RocketMQ为什么这么快呢? 接 ...

  5. 单词本z ambition 雄心 amb = ab = about = around = 环绕

    ambition 雄心 amb = ab = about = around = 环绕 it = go = 走 ion 名词 重点是 amb 环绕 这里是抽象含义 表示内心向外扩展 所以是雄心 ambu ...

  6. TI工程师总结的判断ADS129x是否工作正常的方法步骤

    当大多数 ADC 出现无响应时,可以通过一些基本的调试技术帮助验证器件是否仍然正常工作.以下是 ADS129x 器件出现无响应时需要采取的一些基本步骤: 为器件通电.然后探测器件电源引脚或最近的去耦电 ...

  7. Java8的核心功能就是Lambda和Streaming API

    Java8的核心功能就是Lambda和Streaming API

  8. 低代码平台前端的设计与实现(二)构建引擎BuildEngine切面处理设计

    上一篇文章,我们介绍了如何设计并实现一个轻量级的根据JSON的渲染引擎,通过快速配置一份规范的JSON文本内容,就可以利用该JSON生成一个基础的UI界面.本文我们将回到低开的核心-页面拖拉拽,探讨关 ...

  9. 从零搭建react+ts组件库(二)less模块化与svg引入配置

    在上一篇<从零搭建react+ts组件库(一)项目搭建与封装antd组件>介绍了使用webpack来搭建一个基于antd的组件库的基本框架,但是作为一个组件库,实际上还有很多的都还未引入, ...

  10. OpenLayers绘制热力图 代码记录

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 做地图开发,往往需要掌握专题地图制作的技能.今天用OpenLayers6来做一个热力图的效果. 页面效果: 代码部分: <!DOCT ...