如何从字符串创建属性(集合)表达式选择器?

时间:2012-11-24 16:35:57

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

我想在 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);

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

https://gist.github.com/4149424

我没有编译生成的表达式,但它构建了表达式而没有异常。

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

它处理您访问集合Orders.OrderID的属性的场景,这使得它变得复杂。没有它,它将缩短约30行。

目前,它的作用是将字符串拆分为'。'然后它以递归方式处理每个元素。如果元素是IEnumerable(但不是字符串),则构建一个额外的Select lambda。

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