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大模型
和专业工程师共享工作效率翻倍的秘密
热门API
- 1. AI文本生成
- 2. AI图片生成_文生图
- 3. AI图片生成_图生图
- 4. AI图像编辑
- 5. AI视频生成_文生视频
- 6. AI视频生成_图生视频
- 7. AI语音合成_文生语音
- 8. AI文本生成(中国)
最新文章
- Python调用免费翻译API实现Excel文件批量翻译
- 为开源项目 go-gin-api 增加 WebSocket 模块
- AI编程的风险,如何毁掉你的 API?
- 使用预约调度API的运输管理
- Claude 免费用户频繁被限流?实用应对策略推荐
- 如何获取谷歌新闻 API Key 密钥(分步指南)
- API 目录 – 什么是 API 目录?
- 用NestJS和Prisma: Authentication构建一个REST API
- DeepSeek – Anakin.ai 的 Reason 模型 API 价格是多少?
- 19个API安全最佳实践,助您实现安全
- 如何免费调用Kimi API实现项目集成
- 探索 Zomato API 的潜力