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
其他就是一些简单的操作,查询公司名,然后模糊搜索。这里面也有一个小技巧,就是模糊的东西写在后面,因为这样可以先过滤一大半,有助于效率。
子资源
如下:
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的参数一般是类的缘故。
结
下一节分页
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构