使用graphql-net执行查询时遇GraphQL.Parser.SourceException错误求助
解决GraphQL.Net中“field 'user' is a value type and cannot be selected from”异常
兄弟,这个异常我之前玩graphql-net的时候也踩过坑,本质是你把值类型字段当成对象类型来查询了,或者工具自动把某个字段识别成了值类型,导致没法嵌套查询。下面给你一步步捋清楚怎么解决:
第一步:先检查你的GraphQL查询语句
这个报错最常见的原因就是查询写法错了。比如如果user是字符串、数字这类简单值类型,或者EF里的复杂值类型/拥有实体,你却给它加了花括号做嵌套查询:
错误写法:
query { someEntity { user { # 这里踩坑了!user是值类型,不能这么嵌套查询 id } } }正确写法(如果user是简单值类型):
query { someEntity { user # 直接取字段值就行,不用加花括号 } }
第二步:如果user是复杂值类型/EF拥有实体
如果user是你自定义的复杂类型(比如struct,或者EF里用[Owned]标记的实体),graphql-net默认会把它当成值类型处理,这时候你需要显式把它注册为GraphQL对象类型,允许嵌套查询。
修改你的schema初始化代码:
public void test() { var schema = GraphQL<AdtDbContext>.CreateDefaultSchema(() => new AdtDbContext()); // 显式注册你的值类型为GraphQL对象类型 schema.AddType<UserValueType>(); // 把UserValueType换成你实际的user字段类型 schema.AddType<NTC_TC_YourEntity>(); // 替换成你的实体类型 // 完成schema配置 schema.Complete(); }
第三步:强制标记字段为复杂类型
如果自动注册类型还不行,你可以直接在实体字段上配置,强制把它识别为复杂对象类型:
public void test() { var schema = GraphQL<AdtDbContext>.CreateDefaultSchema(() => new AdtDbContext()); schema.Type<NTC_TC_YourEntity>() .Field(x => x.user) .IsComplexType(); // 告诉工具这个字段是复杂类型,允许嵌套查询 schema.AddType<UserValueType>(); schema.Complete(); }
做完这些调整后,再重新运行查询应该就不会报错了。
内容的提问来源于stack exchange,提问作者user2643892
相关产品推荐
相关产品推荐

