如何用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
相关产品推荐
相关产品推荐

