MongoDB无法确定表达式错误的序列化信息

时间:2015-01-20 06:48:31

标签: 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 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为“目标温度”并且其Value&gt;的网关的网关。 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)

请说明我的错误。

2 个答案:

答案 0 :(得分:7)

如错误所示,您无法在查询中使用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中实际为int的值,因此您需要更改属性的类型:

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

答案 1 :(得分:0)

摘要

我在修改列表时遇到了这个问题。对于我来说,MongoDB似乎没有很好地处理Linq First/FirstOrDefault。我改为数组索引var update = Builders<Movie>.Update.Set(movie => movie.Movies[0].MovieName, "Star Wars: A New Hope");注意:这是使用MongoDB.Driver 2.2.0在Asp.Net 5中。

完整示例

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