【问题标题】:How to create a property (collection) expression selector from a string?如何从字符串创建属性(集合)表达式选择器?
【发布时间】:2012-11-24 16:35:56
【问题描述】:

我想在 linq 表达式中转换字符串“Employee.Orders.OrderID”:“employee.Orders.Select(order = > order.OrderID)".

我已经知道如何在诸如“Employee.FirstName”之类的简单属性中执行此操作,我的问题是如何在集合中的类型内的属性中执行此操作。

“订单”是“员工”类中订单的集合。 “OrderID”是“Order”类的属性。

也就是说,我想改造这个;

string path = "Employee.Orders.OrderID";

进入这个;

Expression<Func<Employee, object>> exp = employee => employee.Orders.Select(order => order.OrderID);

【问题讨论】:

    标签: c# linq lambda expression-trees dynamic-linq


    【解决方案1】:

    这应该可以解决问题:

    https://gist.github.com/4149424

    我还没有编译生成的表达式,但它会毫无例外地构建表达式。

    编辑:我添加了一行来创建 lambda 并对其进行编译,它确实如此,所以它可以工作。

    它处理您访问集合Orders.OrderID 的属性的场景,这是使它有点复杂的部分。如果没有它,它会缩短大约 30 行。

    目前,它所做的是将字符串拆分为 '.'然后它递归地处理每个元素。如果元素是IEnumerable(但不是字符串),它会构建一个额外的Select lambda。

    它还处理稍微复杂(但更多相同)的场景,您可以在集合属性中访问集合属性。

    【讨论】:

    • 我还没来得及测试,但是非常好,谢谢。我会在几个小时内做一些测试,如果可以确认你的答案,我会回来。
    • 所以我回来感谢您的帮助,您的回答完美无缺。你帮助一个开源项目变得更好,如果你或任何人想了解更多关于这个项目的信息,请看这里:tgh.codeplex.com
    • 很高兴我能帮上忙 :) 祝项目好运!我有一个类似的项目(github.com/JulianR/ThisMember/wiki 比你的库更类似于 Automapper),它用表达式做了很多事情,因此我知道这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 2013-08-21
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多