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

Ami*_*ain 1 .net c# 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; }
}
Run Code Online (Sandbox Code Playgroud)

我在MongoDB数据库中填充了10个Gateway的文档对象.现在我想查询所有那些包含参数ParamName为"目标温度"并且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);
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,它会给出异常

Unable to determine the serialization information for the expression: (Parameter p) => Int32.Parse(p.Value)
Run Code Online (Sandbox Code Playgroud)

请告诉我错在哪里.

i3a*_*non 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"));
Run Code Online (Sandbox Code Playgroud)

但是,这可能不是你想要做的事情,因为你正在使用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));
Run Code Online (Sandbox Code Playgroud)