前言

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

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

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

正文

在前文中说过,如果是查询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. Centos8 ssh配置三台虚拟机免密登录 root 及 非root 稍有差异;SSH的免密登录详细步骤

    为了保证一台Linux主机的安全,所以我们每个主机登录的时候一般我们都设置账号密码登录.但是很多时候为了操作方便,我们都通过设置SSH免密码登录. 一.配置SSH 基本语法:假设要用用户名root登录 ...

  2. 【架构师视角系列】QConfig配置中心系列之Server端(三)

    声明 原创文章,转载请标注.https://www.cnblogs.com/boycelee/p/17993697 <码头工人的一千零一夜>是一位专注于技术干货分享的博主,追随博主的文章, ...

  3. vscode 两种定位跳转的方法 ctrl+p 方法1 path:行号 方法2 #变量名 - 针对$store变量不好找的方案 方法1可以备注在代码里面

    vscode 两种定位跳转的方法 ctrl+p 方法1 path:行号 方法2 #变量名 - 针对$store变量不好找的方案 方法1可以备注在代码里面 问题 $store的变量不能跳转,有跳转插件也 ...

  4. axios 报 登出跨域 withCredentials: false,

    withCredentials: false, 默认值虽然是false,但是之前包装的时候设置成true了,所以最后再设置回来

  5. C# 常用特性(Attribute)

    目录 指定方法实现的属性MethodImplAttribute 标记不再使用的程序元素ObsoleteAttribute 指定属性或事件的说明DescriptionAttribute 未完待续... ...

  6. Educational Codeforces Round 141:C. Yet Another Tournament

    一.来源:Problem - C - Codeforces 二.题面 三.思路 读题: 其他人的胜场由位次决定,对于第i位,其胜场为i-1 人数为\(5·10^5\),不是5(看错了) 每个人和自己比 ...

  7. 【ATCOER、D - ±1 Operation 2】前缀和+排序二分

    import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; public cla ...

  8. 地理探测器R语言实现:geodetector

      本文介绍基于R语言中的geodetector包,依据多张栅格图像数据,实现地理探测器(Geodetector)操作的详细方法.   需要说明的是,在R语言中进行地理探测器操作,可以分别通过geod ...

  9. 三维模型3DTile格式轻量化压缩在移动智能终端应用方面的重要性分析

    三维模型3DTile格式轻量化压缩在移动智能终端应用方面的重要性分析 随着移动智能终端设备的不断发展和普及,如智能手机.平板电脑等,以及5G网络技术的推广应用,使得在这些设备上频繁使用三维地理空间数据 ...

  10. 如何用Flask中的Blueprints构建大型Web应用

    本文分享自华为云社区<构建大型Web应用Flask中的Blueprints指南>,作者: 柠檬味拥抱. 什么是Blueprints? Blueprints是Flask中的一种模式,用于将应 ...