更新数组,索引有问题

时间:2015-06-13 08:24:05

标签: c# mongodb mongodb-.net-driver

我的代码有问题,使用mongodb c#driver。 这个问题看起来像这里描述的那样:http://www.ciiycode.com/0iiBNWWexjex/how-to-update-items-in-an-arraylist-with-mongo-c-driver.html 这似乎已经解决了。

我想更新文档中的二维数组。 如果我使用

myarray[0,3] 

它有效,但是如果我使用像

这样的变量
int a = 0;
int b = 3;
myarray[a,b]

它给了我“无法确定表达式的序列化信息...”错误

完整代码:

int a = 0;
int b = 3;    
var update = Builders<sensorValuesDocument>.Update                  
                    .Set(e => e.values[a][b]
                    , new sensorValues()
                    {
                        v = 0,
                        t = 0,
                        h = 0,
                        c = 0,
                        l = 0
                    }) ...

和我的文档类:

public class sensorValuesDocument
    {
        ...
        public List<List<sensorValues>> values { get; set; }
        ...
    }

 public class sensorValues
    {
        [BsonRepresentation(BsonType.Double, AllowTruncation = true)]
        public float? t { get; set; }
        [BsonRepresentation(BsonType.Double, AllowTruncation = true)]
        public float? v { get; set; }
        [BsonRepresentation(BsonType.Double, AllowTruncation = true)]
        public float? h { get; set; }
        [BsonRepresentation(BsonType.Double, AllowTruncation = true)]
        public float? l { get; set; }
        [BsonRepresentation(BsonType.Double, AllowTruncation = true)]
        public float? c { get; set; }
    }

如果我用.Set替换前面的代码(e =&gt; e.values [0] [3] 它工作得很好。 有什么想法/解决方法吗? 提前致谢

于连

1 个答案:

答案 0 :(得分:0)

我猜这是MongoDB C#驱动程序的一些问题,它在数组访问时无法翻译整个GradeGridView_RowLeave()表达式树&#39;索引是变量

幸运的是,C#是一种非常强大的语言,它支持表达式树,它允许您以编程方式创建表达式,如数据结构。

在一天结束时,你需要一个这样的表达式:.Set(...)使用整数文字,对吗?

请参阅以下代码:

listOfLists => listOfLists [0][3]

现在,您可以将int a = 0; int b = 3; // This is the input parameter for the expression (i.e. the (doc) => part of the expression) ParameterExpression valuesDocumentParameter = Expression.Parameter(typeof(sensorValuesDocument)); // This is the "values" property access. Now we would have the following expression: // (doc) => doc.values MemberExpression listOfListPropertyAccess = Expression.Property(valuesDocumentParameter, "values"); // This is accessing the parent list: (doc) => doc.values[0] IndexExpression parentListIndexerAccess = Expression.Property ( listOfListPropertyAccess, "Item", new Expression[] { Expression.Constant(a) } ); // This is accessing the nested list: (doc) => doc.values[0][3] IndexExpression nestedListIndexerAccess = Expression.Property ( parentListIndexerAccess, "Item", new Expression[] { Expression.Constant(b) } ); // This builds the full expression tree! Expression<Func<sensorValuesDocument, sensorValues>> setExpr = Expression.Lambda<Func<sensorValuesDocument, sensorValues>> ( nestedListIndexerAccess, valuesDocumentParameter ); 提交给setExprUpdate.Set(...)

我相信这应该可以解决MongoDB驱动程序的问题,因为你提供了它真正期望的东西:使用文字而不是变量进行数组访问。