【发布时间】:2014-04-18 11:33:18
【问题描述】:
有没有一种简单的方法来组合两个 lambda 样式表达式,如下所示(我知道示例表达式可以手动组合成一个,但如果 innerExpression 由某个函数返回并且事先不知道怎么办)。它们具有相同的输入参数类型,因此理论上 ParameterExpression 可以同时用于它们。
Expression<Func<Source, Subtype>> innerExpression = x => new Subtype {
Subfield1 = x.SomeField;
Subfield2 = x.SomeOtherField;
}
Expression<Func<Source, Target>> finalExpression = x => new Target {
Field1 = x.Other1,
Field2 = x.Other2,
Field3 = x.Items.Where(y => y.Field == true).SingleOrDefault(),
Field4 = innerExpression(x) // <= Does not work that way
}
【问题讨论】:
-
表达式必须在你调用它们之前被编译(参见this post的例子)。 Field4 是 SubType,而不是 Expression<...> 那么你不能简单地为它分配一个表达式。也就是说,这可能会阻止 finalExpression 的使用者按预期工作(例如,如果您使用的是 LINQ To SQL 或实体)。
-
表达式永远不会被编译我需要表达式树来进行进一步的操作,手动创建表达式树会做更多的工作并且可读性会降低。但正如我所料,没有简单的方法可以将它们结合起来。
-
@Fionn is 实际上是一种(相对)简单的组合它们的方法。您可以以足够通用的方式编写表达式操作代码一次,然后您可以在此处执行您尝试执行的特定操作,而无需进行任何权限操作。
-
您可以使用LINQKit 来执行此操作。
标签: c# .net lambda expression-trees