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的參數一般是類的緣故。

下一節分頁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章