
什么是 REST API?
在上一节中,我们了解到 ToList()
会触发 SQL 查询,就像开火 SQL “枪”一样,一旦调用就把请求发往数据库并返回结果。
但当我们需要在查询前动态添加筛选条件时,必须使用 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