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

如何用ServiceStack AutoQuery实现Vue3数据网格的服务端动态过滤?

解决方案

要实现ServiceStack AutoQuery结合动态JSON过滤条件的功能,你需要将前端传入的过滤规则转换为AutoQuery可识别的查询条件,以下是具体实现步骤和代码修改:

1. 修正基础类定义

首先统一过滤参数类名(修复代码中的命名不一致问题),并确保JSON结构与类属性匹配:

public class PageParameter
{
    public string Field { get; set; }
    public string Operand { get; set; } // 支持eq(等于), cn(包含), gt(大于), lt(小于)等操作符
    public string Value { get; set; }
    public string Type { get; set; } // 值类型:string, int, long, bool等
}

同时修正GetConnectors DTO的属性名(与前端传参的JSON键名保持一致):

[Route("/GetConnectors", "POST")]
public class GetConnectors : QueryDb<Connector>
{
    public string Id { get; set; }
    public string PageParameterJson { get; set; } // 接收前端传入的过滤条件JSON
}

2. 服务端动态构建过滤条件

在服务方法中,将JSON反序列化为过滤条件列表,然后逐个转换为AutoQuery的查询条件:

public async Task<object> Any(GetConnectors query)
{
    using var db = AutoQuery.GetDb(query, Request);
    var filters = query.PageParameterJson.FromJson<List<PageParameter>>();

    // 初始化AutoQuery基础查询
    var q = AutoQuery.CreateQuery(query, Request, db);

    foreach (var filter in filters)
    {
        // 生成唯一参数名,避免SQL注入和参数冲突
        var paramName = $"@{filter.Field}_{Guid.NewGuid():N}";
        string sqlCondition = filter.Operand.ToLower() switch
        {
            "eq" => $"{filter.Field} = {paramName}",
            "cn" => $"{filter.Field} LIKE {paramName}",
            "gt" => $"{filter.Field} > {paramName}",
            "lt" => $"{filter.Field} < {paramName}",
            "ne" => $"{filter.Field} != {paramName}",
            "sw" => $"{filter.Field} LIKE {paramName}", // 前缀匹配
            "ew" => $"{filter.Field} LIKE {paramName}", // 后缀匹配
            _ => throw new NotSupportedException($"不支持的操作符:{filter.Operand}")
        };

        // 处理LIKE查询的通配符
        object filterValue;
        if (new[] { "cn", "sw", "ew" }.Contains(filter.Operand.ToLower()))
        {
            string value = filter.Value;
            if (filter.Operand.ToLower() == "sw")
                value = $"{value}%";
            else if (filter.Operand.ToLower() == "ew")
                value = $"%{value}";
            else
                value = $"%{value}%";
            filterValue = value;
        }
        else
        {
            // 将字符串值转换为指定类型
            filterValue = Convert.ChangeType(filter.Value, Type.GetType($"System.{filter.Type}", true));
        }

        // 向查询中添加条件
        q.Where(sqlCondition, new Dictionary<string, object> { { paramName.TrimStart('@'), filterValue } });
    }

    // 执行查询并返回结果
    return await AutoQuery.ExecuteAsync(query, q, Request, db);
}

3. 修正前端JSON格式

确保前端传入的JSON语法正确(修复原示例中缺少逗号的问题):

[
    {
        "Field":"Name",
        "Operand":"cn",
        "Value":"test",
        "Type":"string"
    },
    {
        "Field":"Id",
        "Operand":"eq",
        "Value":"2",
        "Type":"string"
    }
]

关键说明

  • 使用原始SQL条件的方式比反射表达式更灵活,适合动态字段场景
  • 通过唯一参数名避免SQL注入风险,同时解决参数名冲突问题
  • 支持多种常见操作符,可根据需求扩展更多规则
  • 类型转换确保值与数据库字段类型匹配,避免查询错误

内容的提问来源于stack exchange,提问作者stiqma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:55:35