如何转换Expression <func <t1,bool =“”>&gt;表达式<func <t2,bool =“”>&gt;

时间:2017-08-25 13:10:16

标签: c# linq lambda expression

我需要转换表达式

来自:Expression<Func<T1, bool>>

收件人:Expression<Func<T2, bool>>

由于T1T2可能不同,我知道需要重新创建表达式。我希望有一个小方法,我可以重用多个对象。

1 个答案:

答案 0 :(得分:2)

在一般情况下,这是不可能的。这是一个简单的例子来说明我的观点:

class Apple {
    public int Weight {get;set;}
}
class Orange {
    public int Diameter {get;set;}
}
Expression<Func<Apple,bool>> heavy = a => a.Weight > 250;

即使您遍历heavy的表达式树,也无法将Weight的{​​{1}}转换为与Apple相关的任何内容。

调用仅适用于表达式中Orange的方法会产生类似的问题。

在有限的情况下,Apple上的表达仅限于T1上的成员,您可以使用ExpressionVisitor类进行转换。覆盖VisitMember,查看T2的{​​{1}}内容,在MemberExpression node中找到相应的成员,然后构建替换T1。这可能是使用在DTO上构建的表达式查询后端数据库的可行技巧。