Попробуйте найти решение с помощью обычных лямбд, прежде чем думать о деревьях выражений.
У вас есть предикат
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);
}