GraphQL non-nullable
在.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了