EF Core API 高级查询:使用 IQueryable 与 QueryObject 实现动态过滤
作者:xiaoxin.gao · 2025-06-27 · 阅读时间:4分钟
ASP.NET Core REST API 过滤 查询
ASP.NET Core 多条件查询
EF Core 动态过滤
EF Core 延迟执行 IQueryable
FromQuery 注解 用法
IQueryable 教程
引言:延迟执行与动态过滤 在上一节中,我们了解到 ToList() 会触发 SQL 查询,就像开火 SQL “ […]
文章目录
引言:延迟执行与动态过滤
在上一节中,我们了解到 ToList() 会触发 SQL 查询,就像开火 SQL “枪”一样,一旦调用就把请求发往数据库并返回结果。
但当我们需要在查询前动态添加筛选条件时,必须使用 IQueryable 延迟执行,待链式逻辑构建完成后再“一次性”开火。

一、为何使用 IQueryable
-
ToList()- 直接触发 SQL,获取完整结果。

-
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();
}
四、修改 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 调试与验证
- 运行项目并打开 Swagger UI:
- 在 GET
/api/stock中填入不同的companyName与symbol参数组合,点击 “Try it out” 查看返回结果,确认过滤逻辑生效。

小结
- 掌握了
IQueryable延迟执行的核心原理。 - 学会了定义灵活的
QueryObject,动态接收多条件查询参数。 - 在仓储层通过链式调用构建条件,最后才调用
ToListAsync()开火 SQL。
下一步可在 QueryObject 中加入分页、排序等更多可选项,进一步丰富 API 的查询能力。希望对您有所帮助!
原文引自YouTube视频:https://www.youtube.com/watch?v=vszGxxxfp6s
热门推荐
一个账号试用1000+ API
助力AI无缝链接物理世界 · 无需多次注册
3000+提示词助力AI大模型
和专业工程师共享工作效率翻倍的秘密
