如何在Api服务中从Syncfusion QueryBuilder RuleModel获取SQL查询?
解决Syncfusion QueryBuilder服务端GetSqlFromRules空引用异常
- 核心问题:你直接new的
SFQueryBuilder<MyEntity>实例没有配置Columns属性,GetSqlFromRules方法需要依赖列信息解析规则生成SQL,空的Columns会触发空引用异常。另外还要确保反序列化后的ruleModel本身及内部属性不为null。
修正步骤
必须手动配置QueryBuilder的Columns
服务端的QueryBuilder没有客户端的上下文,得明确告诉它实体的字段名称、类型等信息,和你客户端QueryBuilder里的配置保持一致:var queryBuilder = new SFQueryBuilder<MyEntity>(); // 按MyEntity的实际属性配置列 queryBuilder.Columns = new List<QueryBuilderColumn> { new QueryBuilderColumn { Field = "Id", Label = "ID", Type = "number" }, new QueryBuilderColumn { Field = "Name", Label = "名称", Type = "string" }, // 补充其他实体属性对应的列 };校验反序列化结果
确保ruleJson能正确反序列化为有效的RuleModel,尤其是枚举类型(比如Operator、FilterType)要正确处理,避免反序列化失败导致ruleModel为null:// 以System.Text.Json为例,添加枚举转换器 var jsonOptions = new JsonSerializerOptions { Converters = { new JsonStringEnumConverter() } }; var ruleModel = JsonSerializer.Deserialize<RuleModel>(ruleJson, jsonOptions); // 加非空校验 if (ruleModel == null) { throw new ArgumentNullException(nameof(ruleModel), "规则JSON反序列化失败,得到空模型"); }调用GetSqlFromRules生成SQL
现在再调用方法就不会触发空引用了:var query = queryBuilder.GetSqlFromRules(ruleModel);
额外注意
- 客户端和服务端的列配置(Field名称、Type)必须完全一致,否则会出现字段无法匹配的问题。
- 如果你用的是Newtonsoft.Json,要确保枚举反序列化配置正确(比如
StringEnumConverter)。
内容的提问来源于stack exchange,提问作者Moh
相关产品推荐
相关产品推荐

