GraphQL non-nullable 导致资料库null值无法显示的错误

在.Net Core 底下使用GraphQL

由于回传的必须是non-nullable的值

导致一旦资料库里的栏位值为null的时候会出现exception

"Can't return null for non-nullable"

这目前看起来似乎没有直接解决的方法

必须绕个路

一般来说,我们可能会这样回传资料库里的数据

public Task<List<Data>> GetData(){    return Task.Run(()=>    {        return _db.Data.Where(x => x.id == id).ToList();    });}

但这样一但资料内有null就会在转换成GraphQLType时出现上面的错误

所以如果不想在资料库处理将所有的null都设预设值

那就只好从回传的资料处理

将所有null转成string.empty或是int 0

在这裏可以新做一个介面方便依赖注入使用(这边使用泛型方便不同资料结构使用)

public interface IGraphQLTypeHelper{    List<T> GrapphTypeSetValueWhenNull<T>(List<T> data);}

实做部分大概像这样

public class GraphQLTypeHelper:IGraphQLTypeHelper{    public List<T> GrapphTypeSetValueWhenNull<T>(List<T> data)    {        foreach (var r in data)        {            var fd = r.GetType().GetFields(BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.Static);            foreach (var d in fd)            {                if (d.GetValue(r) == null )                {                    if (d.FieldType.ToString().Contains("Int32"))                    {                        d.SetValue(r,0);                    }                    else if (d.FieldType.ToString().Contains("String"))                    {                        d.SetValue(r,"");                    }                }            }        }        return data;    }}

利用反射的方式取得EntityFramework的Class内的变数值

再将null 转成0或是string.Empty

再将IGraphQLTypeHelper注入到实作的class内

最后将原本取得资料的Linq改为下面这样

public Task<List<Data>> GetData(){    return Task.Run(()=>    {        return _graphQlTypeHelper.GrapphTypeSetValueWhenNull(_db.Data.Where(x => x.id == id).ToList());    });}

如此就可以顺利将值传回到GraphqlType了


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章