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; }
}