RestfulApi 学习笔记——查询与过滤还有搜索(四)

前言

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

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

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

正文

在前文中说过,如果是查询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的参数一般是类的缘故。

下一节分页

上一篇:0528jwt、restfulapi


下一篇:利用python实现pdf文字索引及相关链接