我的代码有问题,使用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] 它工作得很好。 有什么想法/解决方法吗? 提前致谢
于连
答案 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
);
提交给setExpr
:Update.Set(...)
。
我相信这应该可以解决MongoDB驱动程序的问题,因为你提供了它真正期望的东西:使用文字而不是变量进行数组访问。