您可以使用原始 graphQL 语法使用 octokit.net 库在 c# 中查询 github API v4 吗?
Can you use raw graphQL syntax to query github API v4 in c# using octokit.net library?
我正在尝试使用 graphQL 来查询存储库及其内容,但不知道如何在 LinQ 中构建所需的查询。有什么方法可以避免使用 LinQ 语法来执行原始 GraphQL 查询吗?
我的功能 GraphQL 查询如下所示:
{
repositoryOwner(login: "userLogin") {
repositories(first: 99) {
nodes {
name
rootFolder: object(expression: "master:") {
id
... on Tree {
entries {
name
object {
... on Blob {
byteSize
}
}
}
}
}
}
}
}
}
使用 LinQ 语法我得到了这一点:
var query = new Query()
.RepositoryOwner("userLogin")
.Repositories(first: 99)
.Nodes.Select(repo => new
{
repo.Name
}).Compile();
var result = await connection.Run(query);
而且我找不到在 Blob 选择器上实现这些的方法
编辑:
Cyril Durand 的答案有效,但不幸的是没有使用 Octokit.net 客户端,因此您无法将结果解析为 class es 包含在提到的库中。您可以做的是创建自定义 classes 以完全符合 json 结果。
首先查询数据。
var result = await Connection.PostQueryAsync(@"{
user(login: """ + userName + @""") {
login
avatarUrl
}
}");
然后将其设为 JSON 字符串。 (需要 Newtonsoft.Json 库)
string JsonString = result.Data.user.ToString(Formatting.None);
并且您使用 json2csharp 转换器,它使用 JSON 字符串中的属性创建精确的 class。
对于此查询,生成的 class 如下所示
class User
{
public string login { get; set; }
public string avatarUrl { get; set; }
}
现在您可以使用您的数据了。
这种方法不是最好的,但解决了我查询的大部分问题,因此我将其标记为正确答案。如果您有更好的解决方案(也许您可以实际使用 octokit 库),请随时回答:)
您可以使用 GraphQl.Client
nuget 包并使用原始 graphql 查询:
var client = new GraphQLClient("https://api.github.com/graphql");
client.DefaultRequestHeaders.Add("Authorization", $"bearer {token}");
client.DefaultRequestHeaders.Add("User-Agent", userLogin );
var result = await client.PostQueryAsync(@"{
repositoryOwner(login: """ + userLogin + @""") {
repositories(first: 99) {
nodes {
name
rootFolder: object(expression: ""master:"") {
id
... on Tree {
entries {
name
object {
... on Blob {
byteSize
}
}
}
}
}
}
}
}
}");
然后用类似的东西访问结果:
var size = result.Data.repositoryOwner.repositories.nodes[0].rootFolder.entries[0].@object.byteSize;
我正在尝试使用 graphQL 来查询存储库及其内容,但不知道如何在 LinQ 中构建所需的查询。有什么方法可以避免使用 LinQ 语法来执行原始 GraphQL 查询吗?
我的功能 GraphQL 查询如下所示:
{
repositoryOwner(login: "userLogin") {
repositories(first: 99) {
nodes {
name
rootFolder: object(expression: "master:") {
id
... on Tree {
entries {
name
object {
... on Blob {
byteSize
}
}
}
}
}
}
}
}
}
使用 LinQ 语法我得到了这一点:
var query = new Query()
.RepositoryOwner("userLogin")
.Repositories(first: 99)
.Nodes.Select(repo => new
{
repo.Name
}).Compile();
var result = await connection.Run(query);
而且我找不到在 Blob 选择器上实现这些的方法
编辑:
Cyril Durand 的答案有效,但不幸的是没有使用 Octokit.net 客户端,因此您无法将结果解析为 class es 包含在提到的库中。您可以做的是创建自定义 classes 以完全符合 json 结果。
首先查询数据。
var result = await Connection.PostQueryAsync(@"{
user(login: """ + userName + @""") {
login
avatarUrl
}
}");
然后将其设为 JSON 字符串。 (需要 Newtonsoft.Json 库)
string JsonString = result.Data.user.ToString(Formatting.None);
并且您使用 json2csharp 转换器,它使用 JSON 字符串中的属性创建精确的 class。
对于此查询,生成的 class 如下所示
class User
{
public string login { get; set; }
public string avatarUrl { get; set; }
}
现在您可以使用您的数据了。
这种方法不是最好的,但解决了我查询的大部分问题,因此我将其标记为正确答案。如果您有更好的解决方案(也许您可以实际使用 octokit 库),请随时回答:)
您可以使用 GraphQl.Client
nuget 包并使用原始 graphql 查询:
var client = new GraphQLClient("https://api.github.com/graphql");
client.DefaultRequestHeaders.Add("Authorization", $"bearer {token}");
client.DefaultRequestHeaders.Add("User-Agent", userLogin );
var result = await client.PostQueryAsync(@"{
repositoryOwner(login: """ + userLogin + @""") {
repositories(first: 99) {
nodes {
name
rootFolder: object(expression: ""master:"") {
id
... on Tree {
entries {
name
object {
... on Blob {
byteSize
}
}
}
}
}
}
}
}
}");
然后用类似的东西访问结果:
var size = result.Data.repositoryOwner.repositories.nodes[0].rootFolder.entries[0].@object.byteSize;