Linq - 从表达式<t2> </t2> </t1>创建表达式<t1>

时间:2011-10-02 14:31:48

标签: c# linq predicate linq-expressions

我有一个谓词Expression<Func<T1, bool>>

我需要使用Expression<Func<T2, bool>>作为谓词T1使用T2 Expression.Invoke属性我试图考虑几个approches,可能使用class T2 { public T1 T1; } 但是couln; t抓住它。

供参考:

Expression<Func<T1, bool>> ConvertPredicates(Expression<Func<T2, bool>> predicate) {
  //what to do here...
}

{{1}}

提前多多感谢。

1 个答案:

答案 0 :(得分:7)

在考虑表达式树之前,尝试使用普通的lambda找到解决方案。

你有一个谓词

Func<T1, bool> p1

并想要一个谓词

Func<T2, bool> p2 = (x => p1(x.T1));

您可以将其构建为表达式树,如下所示:

Expression<Func<T2, bool>> Convert(Expression<Func<T1, bool>> predicate)
{
    var x = Expression.Parameter(typeof(T2), "x");
    return Expression.Lambda<Func<T2, bool>>(
        Expression.Invoke(predicate, Expression.PropertyOrField(x, "T1")), x);
}