C# 数组属性上的Lambda表达式

C# 数组属性上的Lambda表达式,c#,linq,mongodb,lambda,linq-to-objects,C#,Linq,Mongodb,Lambda,Linq To Objects,用例: PHP symfony项目,必须与Mongo的C#后端进行通信。在PHP前端,可以通过查询从Mongo获取数据。此查询通过API(XML)发送。C#后端反序列化此XML以获取对象。然后,我想对内存中的集合执行Linq to objects查询(这是通过API发送的查询)。所以我想制作自己的“LinqBuilder”,这样我就可以查询对象并将它们返回到我的PHP前端 我的目标如下: public class MongoDoc { public int Id { get; set;

用例: 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属性数据中获取属性标识符。通常情况下,它类似于上面的内容:
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")});

谢谢这正是我想要的。我只需要向BsonValue添加一个cast,因为x.Data[“Identifier”]的类型是BsonValue。否则会出现此异常:“没有为“MongoDB.Bson.BsonValue”和“System.String”类型定义二进制运算符Equal”。接下来,如果数据属性有另一个BsonDocument作为属性,那么您需要类似于x.Data[“MoreData”][“Identifier”]@DeluxZ的内容,请参见编辑(也缺少强制转换).谢谢你的提醒:)