繁体   English   中英

数组属性上的Lambda表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM