
深入解析API網關策略:認證、授權、安全、流量處理與可觀測性
但當我們需要在查詢前動態添加篩選條件時,必須使用 IQueryable
延遲執行,待鏈式邏輯構建完成后再“一次性”開火。
IQueryable
ToList()
IQueryable
Where
、OrderBy
、Skip/Take
等,直到最后調用 ToList()
才生成并執行最終 SQL。QueryObject
用于接收查詢參數新建 Helpers/QueryObject.cs
,聲明需要的查詢條件屬性,并用 [FromQuery]
在 Controller 中接收:
public class QueryObject
{
public string? Symbol { get; set; }
public string? CompanyName { get; set; }
}
在倉儲接口 IStockRepository
中,將原來無參數的 GetAllAsync()
改為接收 QueryObject
:
Task<IEnumerable<Stock>> GetAllAsync(QueryObject query);
在 StockRepository
中,修改實現,并使用 AsQueryable()
延遲執行:
public async Task<IEnumerable<Stock>> GetAllAsync(QueryObject query)
{
var stocksQuery = _context.Stocks.AsQueryable(); // 延遲執行
// 根據 CompanyName 過濾
if (!string.IsNullOrWhiteSpace(query.CompanyName))
{
stocksQuery = stocksQuery.Where(s =>
s.CompanyName.Contains(query.CompanyName));
}
// 根據 Symbol 過濾
if (!string.IsNullOrWhiteSpace(query.Symbol))
{
stocksQuery = stocksQuery.Where(s =>
s.Symbol.Contains(query.Symbol));
}
// 最后觸發 SQL 并返回結果
return await stocksQuery.ToListAsync();
}
在 StockController
中,調整 GetStocksAsync
接口簽名,使用 [FromQuery]
注入 QueryObject
:
[HttpGet]
public async Task<ActionResult<IEnumerable<Stock>>> GetStocksAsync(
[FromQuery] QueryObject query)
{
var stocks = await _stockRepository.GetAllAsync(query);
return Ok(stocks);
}
這樣,客戶端可以通過 URL 查詢參數動態指定過濾條件:
GET /api/stock?companyName=Microsoft&symbol=MSFT
/api/stock
中填入不同的 companyName
與 symbol
參數組合,點擊 “Try it out” 查看返回結果,確認過濾邏輯生效。IQueryable
延遲執行的核心原理。QueryObject
,動態接收多條件查詢參數。ToListAsync()
開火 SQL。下一步可在 QueryObject
中加入分頁、排序等更多可選項,進一步豐富 API 的查詢能力。希望對您有所幫助!
原文引自YouTube視頻:https://www.youtube.com/watch?v=vszGxxxfp6s