在HotChocolate+Dapper中如何从IResolverContext提取Where过滤条件?
从HotChocolate的IResolverContext提取过滤条件
要从IResolverContext中提取where子句的过滤信息,可按以下方式操作:
直接获取绑定的输入对象
如果你已经定义了对应where参数的CLR输入类型(比如ProjectWhereInput),可以直接从上下文取出绑定后的实例:var whereInput = context.Argument<ProjectWhereInput>("where");此时
whereInput会包含Name属性(对应name字段),其下的Contains属性值就是"Bridge",直接访问属性就能拿到所需信息。解析查询AST节点
若需要更底层的AST解析(比如你提到的要转换为SQL的场景),可以直接遍历上下文的查询AST节点:// 找到where参数对应的节点 var whereArg = context.Field.Arguments.FirstOrDefault(a => a.Name.Value == "where"); if (whereArg?.Value is ObjectValueNode whereValueNode) { // 遍历where对象的所有字段(这里是name) foreach (var fieldNode in whereValueNode.Fields) { var fieldName = fieldNode.Name.Value; // 得到"name" if (fieldNode.Value is ObjectValueNode opValueNode) { // 遍历操作符节点(这里是contains) foreach (var opNode in opValueNode.Fields) { var operation = opNode.Name.Value; // 得到"contains" var value = ((StringValueNode)opNode.Value).Value; // 得到"Bridge" } } } }
针对你提到的需要将AST转换为SQL的复杂场景,手动解析AST容易出错且效率低,建议参考HotChocolate内置的过滤扩展逻辑,复用其已有的AST解析能力来生成对应的SQL条件,避免重复实现一套过滤规则。
内容的提问来源于stack exchange,提问作者ValidfroM
相关产品推荐
相关产品推荐

