【发布时间】:2016-03-31 18:49:59
【问题描述】:
我正在使用 MongoDB 查询对象将 C# 表达式 (Expression>) 转换为 JSON 查询对象,如下所示:
class TestObj
{
public string Name { get; set; }
public Int32 Age { get; set; }
}
public void TestQueryMethod()
{
var mongoquery = Query<TestObj>.Where(to => to.Age > 20);
var queryjson = mongoquery.ToJson(); // -> { "age" : { "$gt" : "20" }}
}
我想将此 JSON 查询字符串发送到我的后端,后端会将字符串解析为 mongoquery(效果很好)。问题是常量“age”(20)被转换为字符串,而数据库字段是数字类型。因此数据库不会返回任何对象...
我已经查看了驱动程序源代码,常量表达式总是被解析为字符串:
private void VisitValue(object value)
{
// [..]
_sb.Append(value.ToString());
}
更新: 由于我无法访问前端中的数据库集合(前端仅发送 json 查询),因此此解决方案将不起作用。我尝试使用 Builders 类:
var query = Builders<T>.Filter.Where(iCompareCriteria).RenderToBsonDocument().ToJson();
public static BsonDocument RenderToBsonDocument<T>(this FilterDefinition<T> filter)
{
var serializerRegistry = BsonSerializer.SerializerRegistry;
var documentSerializer = serializerRegistry.GetSerializer<T>();
return filter.Render(documentSerializer, serializerRegistry);
}
但这也会产生一个字符串值...
【问题讨论】:
-
是否可以升级您的 C# 驱动程序?
-
我已经考虑过这一点,因为我使用的是旧版驱动程序的一部分。但较新的版本不提供 json 功能的表达式。
-
实际上较新的位确实以几种不同的方式提供了此功能。请参阅下面的帖子。