You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:00:19