[英]Lambda expression on array property
用例:PHP symfony项目,该项目必须与Mongo的C#后端进行通信。 在PHP前端中,可以进行查询以从Mongo获取数据。 该查询通过API(XML)发送。 C#后端对该XML反序列化以获取对象。 然后,我想对我的内存中的集合执行Linq-to-objects查询(即通过API发送的查询)。 因此,我想创建自己的“ LinqBuilder”,以便查询对象并将它们返回到我的PHP前端。
我有以下对象:
public class MongoDoc
{
public int Id { get; set; }
public string Kind { get; set; }
public BsonDocument Data { get; set; }
}
以下是我要实现的示例。
var list = source.Where(x => x.Data["Identifier"] == "H7PXXK").ToList(); // source is collection of MongoDoc objects
上面的代码行是我要使用表达式构建的,因为它必须是动态的。 我要做的是查询MongoDoc对象的“ Kind”属性,如下所示:
ParameterExpression _expr = Expression.Parameter(typeof(MongoDoc), "x");
expression = Expression.Equal(
Expression.PropertyOrField(_expr, "Kind"),
Expression.Constant("KindValue")
);
这将产生以下lamdba:
x => (x.Kind == "KindValue")
没错,但是现在我需要在BsonDocument属性Data中获取属性Identifier。 通常,它类似于上面的内容: x => x.Data["Identifier"] == "Value"
。 这正是我的问题所在。 我该如何实现?
认为应该是这样的。
var _expr = Expression.Parameter(typeof(MongoDoc), "x");
//x.Data
Expression member = Expression.PropertyOrField(_expr, "Data");
//x.Data["Identifier"]
member = Expression.Property(member, "Item", new Expression[]{Expression.Constant("Identifier")});
//x.Data["Identifier"] == "H7PXXK"
member = Expression.Equal(member, Expression.Constant((BsonValue)"H7PXXK"));
编辑:
根据您的评论,应该是
//x.Data["MoreData"]
member = Expression.Property(member, "Item", new Expression[]{Expression.Constant("MoreData")});
//x.Data["MoreData"]["Identifier"]
member = Expression.Property(member, "Item", new Expression[]{Expression.Constant("Identifier")});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.