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