ASP.NET Web API自定义状态排除过滤实现方案咨询
在ASP.NET Web API中实现自定义状态排除过滤
1. 解析排除状态参数
假设你的请求参数类定义如下:
public class PurchaseOrderQueryParams { public int PageIndex { get; set; } = 1; // 默认第一页 public int PageSize { get; set; } = 10; // 默认每页10条 public string ExcludeStatus { get; set; } }
在API接口方法中,先将逗号分隔的ExcludeStatus字符串拆分为状态列表,同时处理空值或空白的情况:
[HttpGet] public async Task<IActionResult> GetPurchaseOrders([FromQuery] PurchaseOrderQueryParams queryParams) { // 拆分排除状态,去除每个状态的首尾空白 var excludeStatuses = !string.IsNullOrWhiteSpace(queryParams.ExcludeStatus) ? queryParams.ExcludeStatus.Split(',').Select(s => s.Trim()).ToList() : new List<string>(); // 后续查询逻辑... }
2. 使用EF Core构建过滤查询
如果用Entity Framework Core对接PostgreSQL,直接通过LINQ实现NOT IN逻辑,同时集成分页:
// 假设DbContext中已注册视图对应的DbSet var baseQuery = _dbContext.VwPurchaseOrderList.AsQueryable(); // 添加排除过滤条件 if (excludeStatuses.Any()) { baseQuery = baseQuery.Where(p => !excludeStatuses.Contains(p.Status)); } // 应用分页 var paginatedResult = await baseQuery .Skip((queryParams.PageIndex - 1) * queryParams.PageSize) .Take(queryParams.PageSize) .ToListAsync(); return Ok(paginatedResult);
3. 原生SQL查询实现(适用于非EF场景)
如果需要直接执行原生PostgreSQL语句,务必使用参数化查询避免SQL注入:
var sqlBuilder = new StringBuilder("SELECT * FROM vwpurchaseorderlist"); var parameters = new List<NpgsqlParameter>(); // 添加排除过滤条件 if (excludeStatuses.Any()) { sqlBuilder.Append(" WHERE NOT status = ANY(@ExcludedStatuses)"); parameters.Add(new NpgsqlParameter("@ExcludedStatuses", NpgsqlDbType.Array | NpgsqlDbType.Text) { Value = excludeStatuses.ToArray() }); } // 添加分页逻辑 sqlBuilder.Append(" OFFSET @Offset LIMIT @PageSize"); parameters.Add(new NpgsqlParameter("@Offset", (queryParams.PageIndex - 1) * queryParams.PageSize)); parameters.Add(new NpgsqlParameter("@PageSize", queryParams.PageSize)); // 执行查询 var result = await _dbContext.VwPurchaseOrderList .FromSqlRaw(sqlBuilder.ToString(), parameters.ToArray()) .ToListAsync(); return Ok(result);
4. API调用示例
调用方可以通过QueryString传递自定义排除状态:
GET /api/purchaseorders?PageIndex=2&PageSize=15&ExcludeStatus=Closed,VOID,Deleted
内容的提问来源于stack exchange,提问作者Shane Brodie
相关产品推荐
相关产品推荐

