但當我們需要在查詢前動態添加篩選條件時,必須使用 IQueryable 延遲執行,待鏈式邏輯構建完成后再“一次性”開火。


一、為何使用 IQueryable


二、定義 QueryObject 用于接收查詢參數

  1. 新建 Helpers/QueryObject.cs,聲明需要的查詢條件屬性,并用 [FromQuery] 在 Controller 中接收:

    public class QueryObject
    {
       public string? Symbol { get; set; }
       public string? CompanyName { get; set; }
    }

  1. 上述屬性均可為空,便于后續在倉儲層判斷是否參與過濾。


三、更新倉儲接口與實現簽名

在倉儲接口 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();
}

四、修改 Controller 接口以支持查詢對象

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


五、Swagger 調試與驗證

  1. 運行項目并打開 Swagger UI:
  2. 在 GET /api/stock 中填入不同的 companyNamesymbol 參數組合,點擊 “Try it out” 查看返回結果,確認過濾邏輯生效。


小結

下一步可在 QueryObject 中加入分頁、排序等更多可選項,進一步豐富 API 的查詢能力。希望對您有所幫助!

原文引自YouTube視頻:https://www.youtube.com/watch?v=vszGxxxfp6s

上一篇:

深入解析 DeepSeek API 密鑰:獲取、使用與最佳實踐
最后一篇
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費