C# MongoDB无法确定表达式错误的序列化信息
我的数据具有以下结构C# MongoDB无法确定表达式错误的序列化信息,c#,.net,mongodb,mongodb-.net-driver,C#,.net,Mongodb,Mongodb .net Driver,我的数据具有以下结构 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 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; }
}
但当我运行这个时,它给出了一个异常
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"));
总结
我在修改列表时遇到了这个问题。对于我来说,MongoDB似乎没有很好地处理Linq First/FirstOrDefault
。我变成了一个数组索引var update=Builders.update.Set(movie=>movie.Movies[0].MovieName,“星球大战:新希望”)代码>注意:这是在Asp.NET5中使用MongoDB.Driver 2.2.0实现的
完整示例
public静态void TypedUpdateExample(){
var客户端=新的MongoClient(“mongodb://localhost:27017");
var database=client.GetDatabase(“测试”);
var collection=database.GetCollection(“示例”);
//创建一些示例数据
var movies=新电影{
Name=“TJ”,
电影=新列表
{
新电影资料{
MovieName=“星球大战:原力觉醒”
}
}
};
收藏:InsertOne(电影);
//创建筛选器以检索示例数据
var filter=Builders.filter.Eq(“\u id”,movies.id);
//var update=Builders.update.Set(“名称”,“另一个名称”);
//TODO:LP:TSTUDE:检查是否有空电影
var update=Builders.update.Set(movie=>movie.Movies[0].MovieName,“星球大战:新希望”);
collection.UpdateOne(过滤器,更新);
}
公映{
[BsonId]
公共对象Id{get;set;}
公共字符串名称{get;set;}
公共列表电影{get;set;}
}
公共级电影资料{
[BsonId]
公共对象Id{get;set;}
公共字符串MovieName{get;set;}
}
您提供的备选方案都无法解决我的用例。它没有产生任何记录。@AmitKumarJain应该吗?数据库中有什么,常规mongo查询是否返回结果?我的数据库中有10个网关文档,每个网关有一个设备,其中一个参数名为“Target Temperature”,值为“20”。当我将查询修改为var parameterQuery=query.And(query.EQ(p=>p.ParamName,“目标温度”)、query.EQ(p=>p.Value,“20”))时,它会返回记录。但是当我使用带有参数15的GT执行查询时,它不会返回记录。我正在使用var result=mGatewayCollection.Find(finalQuery)运行查询@AmitKumarJain如果所有文档的值都是20,那么使用15进行过滤将不会返回任何结果。应该用20过滤。但我用Query.GT过滤它们。这是否也没有任何意义?
var parameterQuery = Query.And(Query<Parameter>.EQ(p => p.ParamName, "Target Temperature"), Query<Parameter>.GT(p => p.Value, "15"));
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));
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; }
}