在.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了