【问题标题】:Can you use raw graphQL syntax to query github API v4 in c# using octokit.net library?您可以使用 octokit.net 库使用原始 graphQL 语法在 c# 中查询 github API v4 吗?
【发布时间】:2019-08-23 17:15:01
【问题描述】:

我正在尝试使用 graphQL 来查询存储库及其内容,但无法弄清楚如何在 LinQ 中构建所需的查询。有什么方法可以执行原始 GraphQL 查询,避免使用 LinQ 语法?

我的功能 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 客户端,因此您无法将结果解析为上述库中包含的类。您可以做的是创建自定义类以完全适合 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 User
{
    public string login { get; set; }
    public string avatarUrl { get; set; }
}

现在您可以处理您的数据了。

这种方法不是最好的,但解决了我的大部分查询问题,因此我将其标记为正确答案。如果您有更好的解决方案的想法(也许您可以实际使用 octokit 库),请随时回答:)

【问题讨论】:

  • 什么库提供查询类?
  • 来自 octokit.GraphQL

标签: c# graphql octokit.net github-api-v4


【解决方案1】:

您可以使用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;

【讨论】:

  • result 的类型是什么?是dynamic吗?因为问题的重点是使用 octokit.net 在查询和结果中进行静态类型。
猜你喜欢
  • 2018-08-25
  • 2018-08-21
  • 2023-03-08
  • 2019-08-20
  • 2018-03-26
  • 2019-10-12
  • 1970-01-01
  • 2018-01-05
相关资源
最近更新 更多