【问题标题】:Lambda expression on array property数组属性上的 Lambda 表达式
【发布时间】:2023-03-10 16:50:01
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    认为应该是这样的。

    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 添加一个强制转换,因为 x.Data["Identifier"] 是 BsonValue 类型。否则你会得到这个异常:“二元运算符 Equal 没有为类型 'MongoDB.Bson.BsonValue' 和 'System.String' 定义。”
    • 接下来是如果 Data 属性有另一个 BsonDocument 作为属性,那么你需要像 x.Data["MoreData"]["Identifier"] 之类的东西
    • @DeluxZ 下一个,请参阅编辑(也缺少演员表)。
    • 感谢您的提醒 :)
    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    相关资源
    最近更新 更多