MongoDB无法确定表达式错误的序列化信息
MongoDB Unable to determine the serialization information for the expression error
我的数据具有以下结构
public enum ParamType
{
Integer=1,
String=2,
Boolean=3,
Double=4
}
public class Gateway
{
public int _id { get; set; }
public string SerialNumber { get; set; }
public List<Device> Devices { get; set; }
}
public class Device
{
public string DeviceName { get; set; }
public List<Parameter> Parameters { get; set; }
}
public class Parameter
{
public string ParamName { get; set; }
public ParamType ParamType { get; set; }
public string Value { get; set; }
}
我在一个MongoDB数据库中填入了10个Gateway的文档对象。
现在我想查询所有那些包含参数 ParamName
为 "Target Temperature" 且 Value
> 15.
的设备的网关
我创建了以下查询
var parameterQuery = Query.And(Query<Parameter>.EQ(p => p.ParamName, "Target Temperature"), Query<Parameter>.GT(p => int.Parse(p.Value), 15));
var deviceQuery = Query<Device>.ElemMatch(d => d.Parameters, builder => parameterQuery);
var finalQuery = Query<Gateway>.ElemMatch(g => g.Devices, builder => deviceQuery);
但是当我运行这个的时候,它给出了一个异常
Unable to determine the serialization information for the expression: (Parameter p) => Int32.Parse(p.Value)
不对的地方请指出
如错误所示,您不能在查询中使用 Int32.Parse
。此 lambda 表达式用于获取 属性 的名称,但它不理解 Int32.Parse
是什么。
如果查询的是字符串,需要使用字符串值进行比较:
var parameterQuery = Query.And(Query<Parameter>.EQ(p => p.ParamName, "Target Temperature"), Query<Parameter>.GT(p => p.Value, "15"));
但是,这可能不是您想做的,因为您正在使用 GT
。要被视为此比较的数字,您需要该值实际上是 mongo 中的一个整数,因此您需要更改 属性:
的类型
public class Parameter
{
public string ParamName { get; set; }
public ParamType ParamType { get; set; }
public int Value { get; set; }
}
var parameterQuery = Query.And(Query<Parameter>.EQ(p => p.ParamName, "Target Temperature"), Query<Parameter>.GT(p => p.Value, 15));
总结
我在修改列表的时候运行进入了这个。看来 Linq First/FirstOrDefault
对我来说 MongoDB 处理得不好。我改为数组索引 var update = Builders<Movie>.Update.Set(movie => movie.Movies[0].MovieName, "Star Wars: A New Hope");
注意:这是在 Asp.Net 5 using MongoDB.Driver 2.2.0.
完整示例
public static void TypedUpdateExample() {
var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("test");
var collection = database.GetCollection<Movie>("samples");
//Create some sample data
var movies = new Movie {
Name = "TJ",
Movies = new List<MovieData>
{
new MovieData {
MovieName = "Star Wars: The force awakens"
}
}
};
collection.InsertOne(movies);
//create a filter to retreive the sample data
var filter = Builders<Movie>.Filter.Eq("_id", movies.Id);
//var update = Builders<Movie>.Update.Set("name", "A Different Name");
//TODO:LP:TSTUDE:Check for empty movies
var update = Builders<Movie>.Update.Set(movie => movie.Movies[0].MovieName, "Star Wars: A New Hope");
collection.UpdateOne(filter, update);
}
public class Movie {
[BsonId]
public ObjectId Id { get; set; }
public string Name { get; set; }
public List<MovieData> Movies { get; set; }
}
public class MovieData {
[BsonId]
public ObjectId Id { get; set; }
public string MovieName { get; set; }
}
我的数据具有以下结构
public enum ParamType
{
Integer=1,
String=2,
Boolean=3,
Double=4
}
public class Gateway
{
public int _id { get; set; }
public string SerialNumber { get; set; }
public List<Device> Devices { get; set; }
}
public class Device
{
public string DeviceName { get; set; }
public List<Parameter> Parameters { get; set; }
}
public class Parameter
{
public string ParamName { get; set; }
public ParamType ParamType { get; set; }
public string Value { get; set; }
}
我在一个MongoDB数据库中填入了10个Gateway的文档对象。
现在我想查询所有那些包含参数 ParamName
为 "Target Temperature" 且 Value
> 15.
我创建了以下查询
var parameterQuery = Query.And(Query<Parameter>.EQ(p => p.ParamName, "Target Temperature"), Query<Parameter>.GT(p => int.Parse(p.Value), 15));
var deviceQuery = Query<Device>.ElemMatch(d => d.Parameters, builder => parameterQuery);
var finalQuery = Query<Gateway>.ElemMatch(g => g.Devices, builder => deviceQuery);
但是当我运行这个的时候,它给出了一个异常
Unable to determine the serialization information for the expression: (Parameter p) => Int32.Parse(p.Value)
不对的地方请指出
如错误所示,您不能在查询中使用 Int32.Parse
。此 lambda 表达式用于获取 属性 的名称,但它不理解 Int32.Parse
是什么。
如果查询的是字符串,需要使用字符串值进行比较:
var parameterQuery = Query.And(Query<Parameter>.EQ(p => p.ParamName, "Target Temperature"), Query<Parameter>.GT(p => p.Value, "15"));
但是,这可能不是您想做的,因为您正在使用 GT
。要被视为此比较的数字,您需要该值实际上是 mongo 中的一个整数,因此您需要更改 属性:
public class Parameter
{
public string ParamName { get; set; }
public ParamType ParamType { get; set; }
public int Value { get; set; }
}
var parameterQuery = Query.And(Query<Parameter>.EQ(p => p.ParamName, "Target Temperature"), Query<Parameter>.GT(p => p.Value, 15));
总结
我在修改列表的时候运行进入了这个。看来 Linq First/FirstOrDefault
对我来说 MongoDB 处理得不好。我改为数组索引 var update = Builders<Movie>.Update.Set(movie => movie.Movies[0].MovieName, "Star Wars: A New Hope");
注意:这是在 Asp.Net 5 using MongoDB.Driver 2.2.0.
完整示例
public static void TypedUpdateExample() {
var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("test");
var collection = database.GetCollection<Movie>("samples");
//Create some sample data
var movies = new Movie {
Name = "TJ",
Movies = new List<MovieData>
{
new MovieData {
MovieName = "Star Wars: The force awakens"
}
}
};
collection.InsertOne(movies);
//create a filter to retreive the sample data
var filter = Builders<Movie>.Filter.Eq("_id", movies.Id);
//var update = Builders<Movie>.Update.Set("name", "A Different Name");
//TODO:LP:TSTUDE:Check for empty movies
var update = Builders<Movie>.Update.Set(movie => movie.Movies[0].MovieName, "Star Wars: A New Hope");
collection.UpdateOne(filter, update);
}
public class Movie {
[BsonId]
public ObjectId Id { get; set; }
public string Name { get; set; }
public List<MovieData> Movies { get; set; }
}
public class MovieData {
[BsonId]
public ObjectId Id { get; set; }
public string MovieName { get; set; }
}