今天來說一個在嘗試 LiteDB 的時候遇到的錯誤,因為該套件的底層是使用 BSON ,所以在還原回物件的時候
他預設都是 LiteDB.BsonValue ,因為我直接下一個查詢語法後直接使用 Json.NET ,
SerializeObject 的時候直接出現錯誤
Unhandled exception. Newtonsoft.Json.JsonSerializationException: Error getting value from 'AsBoolean' on
'LiteDB.BsonValue'.
---> System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Boolean'.
at lambda_method23(Closure, Object)
at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
--- End of inner exception stack trace ---
這邊我直接對 DB 下指令 關於 %LIKE% 的作法,我期許的是他撈回來的時候就會是該物件,但是其實不是而且直接使用萬用的
Json.NET 也會出現錯誤
下面是會出現錯誤的 code:
//%LIKE% 使用 類SQL 語法查詢
using (var db = new LiteDatabase(AppDomain.CurrentDomain.BaseDirectory + "sample.db"))
{
var data1 = db.Execute("SELECT $ FROM FRIENDS WHERE Name LIKE '%IEND999%'").ToArray();
if (data1 != null)
{
foreach (var data in data1)
{
Console.WriteLine(JsonConvert.SerializeObject(data));
}
Console.WriteLine();
Console.WriteLine("Count:" + data1.Length);
}
}
//Error
/*
handled exception. Newtonsoft.Json.JsonSerializationException: Error getting value from 'AsBoolean' on 'LiteDB.BsonValue'.
---> System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Boolean'.
at lambda_method23(Closure, Object)
at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
--- End of inner exception stack trace ---
at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeDictionary(JsonWriter writer, IDictionary values, JsonDictionaryContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
*/
後來研究一下,因為他預設會是回來 LiteDB.BsonValue 所以我們必須要把他轉回原本的物件
後來的修正
//%LIKE% 使用 類SQL 語法查詢
using (var db = new LiteDatabase(AppDomain.CurrentDomain.BaseDirectory + "sample.db"))
{
var data1 = db.Execute("SELECT $ FROM FRIENDS WHERE Name LIKE '%IEND999%'").ToArray();
if (data1 != null)
{
foreach (var data in data1)
{
Console.WriteLine(JsonConvert.SerializeObject(BsonMapper.Global.Deserialize(data)));
}
Console.WriteLine();
Console.WriteLine("Count:" + data1.Length);
}
}
花了我一點時間找錯誤
reference:
https://www.litedb.org/docs/data-structure/