用例: PHP symfony项目必须与C#后端与Mongo通信。在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"
。这正是我的问题所在。我怎样才能做到这一点?
答案 0 :(得分:0)
认为它应该是那样的。
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")});