所有文章 > API开发 > EF Core API 高级查询:使用 IQueryable 与 QueryObject 实现动态过滤
EF Core  API 高级查询:使用 IQueryable 与 QueryObject 实现动态过滤

EF Core API 高级查询:使用 IQueryable 与 QueryObject 实现动态过滤

引言:延迟执行与动态过滤

在上一节中,我们了解到 ToList() 会触发 SQL 查询,就像开火 SQL “枪”一样,一旦调用就把请求发往数据库并返回结果。
但当我们需要在查询前动态添加筛选条件时,必须使用 IQueryable 延迟执行,待链式逻辑构建完成后再“一次性”开火。


一、为何使用 IQueryable

  • ToList()

    • 直接触发 SQL,获取完整结果。

  • IQueryable

    • 延迟执行,支持动态拼接 WhereOrderBySkip/Take 等,直到最后调用 ToList() 才生成并执行最终 SQL。


二、定义 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” 查看返回结果,确认过滤逻辑生效。


小结

  • 掌握了 IQueryable 延迟执行的核心原理。
  • 学会了定义灵活的 QueryObject,动态接收多条件查询参数。
  • 在仓储层通过链式调用构建条件,最后才调用 ToListAsync() 开火 SQL。

下一步可在 QueryObject 中加入分页、排序等更多可选项,进一步丰富 API 的查询能力。希望对您有所帮助!

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

#你可能也喜欢这些API文章!

我们有何不同?

API服务商零注册

多API并行试用

数据驱动选型,提升决策效率

查看全部API→
🔥

热门场景实测,选对API

#AI文本生成大模型API

对比大模型API的内容创意新颖性、情感共鸣力、商业转化潜力

25个渠道
一键对比试用API 限时免费

#AI深度推理大模型API

对比大模型API的逻辑推理准确性、分析深度、可视化建议合理性

10个渠道
一键对比试用API 限时免费