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