gpt4 book ai didi

c# - 关于在 C# 中构建 graphQL 查询的建议

转载 作者:行者123 更新时间:2023-12-05 02:19:52 25 4
gpt4 key购买 nike

我正在从事数据迁移项目 - API 到 API。

目标 API 是 graphQL,我们有许多对象要推送到目标中,并且形状各不相同,所以我正在寻找一些关于如何最好地动态构建特定于 c# 的突变/查询的建议。

目前我们只是使用模板和使用查找/替换例程来注入(inject)值。虽然这种方法在数据形状变化时确实有效,但它变得越来越复杂和不雅观。

我正在寻找可能遇到过类似情况或知道我应该查看的任何库的任何人的任何建议/指示。

最佳答案

更新 - 2018 年 2 月 13 日

我已经更新了这个怪物来满足嵌套的子选择和 GraphQl 枚举,所以如果有人对这里感兴趣,它在 GitHub 中。

原始答案

我有同样的要求。在那里找不到任何东西,所以我想出了这个非常不雅的解决方案。它适用于我的场景,所以我会在此处发布它以供其他寻求解决方案的人使用。

 public static class GraphQlObjectParser
{
public static string Parse(string queryType, string queryName, string[] subSelection, object @object = null, string objectTypeName = null)
{
var query = queryType + "{" + queryName;

if (@object != null)
{
query += "(";

if (objectTypeName != null)
{
query += objectTypeName + ":" + "{";
}

var queryData = string.Empty;
foreach (var propertyInfo in @object.GetType().GetProperties())
{
var value = propertyInfo.GetValue(@object);
if (value != null)
{
var type = Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType;
var valueQuotes = type == typeof(string) ? "\"" : string.Empty;

var queryPart = char.ToLowerInvariant(propertyInfo.Name[0]) + propertyInfo.Name.Substring(1) + ":" + valueQuotes + value + valueQuotes;
queryData += queryData.Length > 0 ? "," + queryPart : queryPart;
}
}
query += (objectTypeName != null ? queryData + "}" : queryData) + ")";
}

if (subSelection.Length > 0)
{
query += subSelection.Aggregate("{", (current, s) => current + (current.Length > 1 ? "," + s : s)) + "}";
}

query += "}";

return query;
}
}

这适用于查询和变更。用法示例如下:

var query = GraphQlObjectParser.Parse("query", "users", new[] { "id", "name" });

给你

query{users{id,name}}

var query = GraphQlObjectParser.Parse("query", "user", new[] { "id", "name" }, new User { Id = 1 });

给你

query{user(id:1){id,name}}

var query = GraphQlObjectParser.Parse("mutation", "user", new[] { "id", "name" }, new User { Id = 1, Name = "John" }, "data");

给你

mutation{user(data:{id:1,name:"John"}){id,name}}

它将与枚举一起工作,这就是我首先需要这个解决方案的原因。您可以传入不带对象的子选择或不带对象类型名称的对象。尽管我还没有考虑到子选择的子选择,但我已经尝试涵盖尽可能多的基础。如果/当我编写这个代码时,我会在这里更新。

希望对大家有帮助。

关于c# - 关于在 C# 中构建 graphQL 查询的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40871190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com