数组属性上的Lambda表达式

时间:2014-01-10 10:43:43

标签: c# linq mongodb lambda linq-to-objects

用例: 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"。这正是我的问题所在。我怎样才能做到这一点?

1 个答案:

答案 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")});