GraphQL non-nullable 導致資料庫null值無法顯示的錯誤

  • 934
  • 0
  • 2019-07-20

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了