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

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

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

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

“Order”是“Employee”类中的订单集合。 “OrderID”是“Order”类的一个属性。

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

string path = "Employee.Orders.OrderID";

进入这个;

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

最佳答案

这应该可以解决问题:

https://gist.github.com/4149424

我没有编译生成的表达式,但它毫无异常(exception)地构建了表达式。

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

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

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

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

关于c# - 如何从字符串创建属性(集合)表达式选择器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13543140/

相关文章:

c# - 如何将 List<X> 转换为 Dictionary<X,Y> 并用 null 填充值?

java - 将 List<String> 中的分隔字符串转换为 List<String>

c# - 如何将 Lambda 表达式转换为 Sql?

c# - 将报告重新绑定(bind)到新的 XML XSD

c# - 请问 GC.SuppressFinalize 有什么实质性影响吗?

c# - 在运行时将绑定(bind)更改为基于列表项的关闭属性的列表的特定元素

c# - Lambda 表达式 同时选择 Min 和 Max

mysql - 如何使用 linq lambdas 将包含数值的 varchar 列排序为实体

c++ - 如何在 private 中定义 lambda 函数?

c# - 请解释一下 .NET 4.0 中的 Func 委托(delegate)