问题标签 [graphql-dotnet]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
40 浏览

graphql-dotnet - 初始化后是否可以更改graphql模式

我正在使用基于不同类型(从程序集中加载)的graphql-dotnet和填充模式。现在我想在不重新启动应用程序服务器的情况下将新类型添加到现有模式中。那可能吗?

0 投票
5 回答
4653 浏览

c# - 带有 GraphQL 的 EF Core

我目前正在探索 GraphQL 开发,我目前正在探索通过 EF Core 生成什么样的 SQL 查询,我观察到,无论我的 GraphQL 查询只包含几个字段,EF Core 都会为所有字段发送 SQL Select实体。

这是我现在使用的代码:

我正在使用的查询是

生成的 SQL 选择 Doctor 实体的所有字段。

有没有办法进一步优化从 EF Core 生成的 SQL 查询?

我猜这是因为 DoctorType 继承自ObjectGraphType<Doctors>而不是继承自 Doctor 的某个 Projection,但我想不出一个聪明的解决方法?

有什么建议么?

编辑:

我正在使用 Joe McBride 版本 2.4.0 的 GraphQL.NET (graphql-dotnet)

编辑2:

要么我做错了,要么我不知道。

作为评论之一,我下载了 SimonCropp 的 GraphQL.EntityFramework Nuget 包

我做了所有需要的配置:

我的对象图类型如下

我的查询看起来是:

我正在使用这个 graphQL 查询

调试日志显示生成的 SQL 查询是

即使我只想要 specializationName 字段并且我希望它是:

更新

我想到目前为止我还不明白 graphQL 是如何工作的。我认为有一些幕后数据获取,但没有。

主要提取在查询的字段解析器中完成:

并且只要解析器的结果是完整对象,在我的情况下,解析器返回Doctors实体列表,它将查询整个实体(所有字段)的数据库。如果您返回 IQueryable 或您正在查询的实体,GraphQL 没有开箱即用的优化并不重要。

这里的每个结论都是我的想法,它不是 100% 保证正确的

所以我所做的是创建一组 Helper 方法,这些方法正在创建一个选择表达式以在 LINQ 查询中使用。助手使用解析器的 context.SubFields 属性来获取所需的字段。

问题是您只需要查询的每个级别的叶子,例如一些带有“SpecializationName”和“代码”的查询“专业化”以及带有“名称”的“医生”等等。在这种情况下,在专业领域的RootQuery解析器中,您只需要实体Specializations投影:SpecializationNameCodeDoctorsSpecializationTypeDoctor

上面的问题是,当您使用查询批处理时,我猜即使您不认为该Doctors字段 SpecializationType需要在专业字段中获取的 SpecializationId RootQuery

我想我没有很好地解释我经历了什么。

据我了解,基线是我们必须动态创建 linq 应该用来投影实体的选择器。

我在这里发布我的方法:

专业化类型

医生服务:

专业化服务

这篇文章已经变得相当大了,抱歉跨度..

0 投票
1 回答
1657 浏览

c# - GraphQL-dotnet 字段 Validation Prior Resolving

我正在使用 GraphQL.Net 2.4.0 在 Asp.Net Core 2.2 中构建 GraphQL API

我创建了控制器来处理 GraphQL 查询:

当我想验证我的某些字段时出现问题InputObjectGraphType,我已经实现了IValidationRule接口。

在此之前,我将元数据添加到我要验证的字段中,以便我可以轻松找到它。我正在获取 fieldType 但无法获取值来验证它。

这是IValidationRulei 使用的实现:

但是这里的 context.Inputs 属性始终为空。在控制器中,这一行var inputs = query.Variables.ToInputs(); 也产生空值。此查询变量字段和文档执行器的输入字段与此有关吗?

0 投票
1 回答
480 浏览

c# - graphql-dotnet 按操作名称查询

我正在使用graphql-dotnet在 Net Core 2.2 Web API 中构建 graphql 服务器。

架构说明:

我有一个ObjectGraphType喜欢下面

我有一个查询定义,例如

我的架构是

我的控制器方法是:

询问:

我发送此查询

这是作品。
但是,如果我更改任何值的操作名称,查询也会执行并获得用户。

我可以在请求中写入任何操作名称,它将成功执行。


我只想通过某些操作名称(在我的情况下getAllUsers)询问用户,我可以在定义的架构中设置某处。如果我跳过操作名称,则不应执行请求。

我该怎么做?

0 投票
1 回答
643 浏览

entity-framework - context.GetArgument() 使用 ByteGraphType 返回 null

我正在学习如何在 graphql-dotnet 中使用 CustomScalar。

我的表中有一个 tinyint 列,从我读过的内容来看,我应该在 C# 中的这个列上使用字节。经过研究,我发现我需要创建一个 ByteGraphType,但我在这样做时遇到了麻烦。

我从这个链接https://github.com/graphql-dotnet/graphql-dotnet/issues/458得到了 ByteGraphType 示例,所以我认为它会起作用。

使用此代码,我可以查询表,但是,我的突变不起作用。我没有找到一个示例来演示突变在字节列中的样子。我按照我的代码示例中的说明进行了尝试,但是在这一行中 (var avaliacao = context.GetArgument("avaliacao");),我的参数 avaliacao.Nota 返回 null,我不确定如何继续。

有人能帮我吗?

谢谢

那是我的密码

//模型

//类型

//输入类型

//询问

//突变

//ByteGraphType

我需要的是能够保存具有 tinyint 列的表的记录。如果我将代码中的类型更改为 int,我可以变异,但不能查询。

0 投票
2 回答
776 浏览

graphql - 如何在graphql dotnet中使用pascal套管而不是camel套管

在这里我有一个突变,如您所见,当我从图形执行此突变时,参数名称是大写 P 的 Product ,字段名称是大写 C 的 CreateProduct 我必须在骆驼外壳上写下字段的名称以及名称关于参数,有没有办法配置 graphql-dotnet 以尊重代码中写入的名称?

0 投票
1 回答
508 浏览

c# - GraphQL + Autofac

我目前正在探索 GraphQL。在我的一个中,我ObjectGraphTypes想注入一个服务实现,它向 EF 查询一些附加数据。

RoomType 和 IUserRepository 都已在 Autofac 容器中注册。但是,在执行期间,RoomType 无法解析,因为它缺少无参数构造函数,这让我认为它是通过反射而不是通过容器构造的。关于如何进行的任何建议?

谢谢!

0 投票
3 回答
3364 浏览

c# - 将 .NET 枚举转换为 GraphQL EnumerationGraphType

如何将枚举转换为 GraphQL 使用的 EnumerationGraphType?这是一个例子来说明我在说什么:

显然这不起作用,因为没有从MeetingStatusTypeto的隐式转换MeetingStatusEnumType在文档中,他们正在映射的模型将直接依赖MeetingStatusEnumType,但在诸如域类型和对象之类的东西上引入对 GraphQL 的依赖似乎并不好。我觉得我错过了一种非常简单的方法来注册这个领域,但我一辈子都想不通。任何帮助将不胜感激!

0 投票
0 回答
164 浏览

graphql - graphql 突变的最佳实践是什么?(.NET 实现)

我目前正在学习 graphql,我不确定我是否正确理解了突变应该如何工作,尤其是与订阅结合使用时。

我有一个包含客户详细信息的页面,其中包括他从我们公司购买的软件产品的描述和列表。在界面中,有一个用于描述的编辑按钮,一个用于将新软件产品添加到客户端列表的加号按钮以及用于每个产品的减号按钮以启用删除它们。
我目前添加了一个突变,它以客户端的 id 和一个字符串 (newDescription) 作为参数并更新客户端的描述。这是正确的还是我应该拥有 id 和 ClientInputType (包含字段描述)并将它们作为参数传递?更重要的是,如果我使用 ClientInputType 并且它包含软件产品的描述和列表,有没有一种方法可以一次只更新一个字段(为了使用相同的突变更新客户端,但只更改必填字段取决于在界面中按下了哪个按钮)?

public Mutation(IClientRepository clientRepository) { this.FieldAsync<ClientType>( "updateClient", arguments: new QueryArguments( new QueryArgument<NonNullGraphType<IntGraphType>> { Name = "id" }, new QueryArgument<StringGraphType> { Name = "newDescription" } ), resolve: async ctx => {...} }

换句话说,我可以让 graphql 以任何方式知道我只想更新 ClientInputType 中的一个字段并且它应该忽略其他字段吗?突变应该返回什么?我正在返回更新的客户端。

0 投票
1 回答
233 浏览

graphql - 当给定参数找不到记录时该怎么办

我刚刚开始使用 graphql-dotnet 开发一个 graphQL API。我已经搜索了文档,但是如果找不到给定参数的记录,我找不到任何关于该怎么做的信息。我检查的参考实现(github、starwars graphql 实现等)返回 null,其中一些包含带有一些额外细节的错误字段。

我想知道的是,是否有任何已建立的最佳实践以及如何使用 graphql-dotnet 以优雅的方式处理它。

谢谢你。