Прежде всего, рассмотрим, какое выражение представляет это дерево выражений.
var property = type.GetProperty("MyStringField");
var parameter = Expression.Parameter(typeof(T), "it");
Expression<Func<T, bool>> predicate =
(Expression<Func<T, bool>>)Expression.Lambda(
Expression.Equal(
Expression.MakeMemberAccess(parameter, property),
Expression.Constant("MyValue")),
parameter);
эквивалентно лямбде:
it => it.MyStringField == "MyValue"
Так что бы вы хотели, чтобы было тогда выражение? Из того, что я понимаю, вы написали, вы хотите что-то вроде этого:
it => it.MyStringField.StartsWith("MyValue") && it.MyNullableIntField >= 12
Хорошо, вы можете написать эту лямбду и сохранить ее в выражении таким образом, чтобы компилятор мог выполнить преобразование за вас:
Expression<Func<T, bool>> predicate =
it => it.MyStringField.StartsWith("MyValue") && it.MyNullableIntField >= 12;
В противном случае, делать это вручную:
var parameter = Expression.Parameter(typeof(T), "it");
var predicate = Expression.Lambda<Func<T, bool>>(
Expression.AndAlso(
Expression.Call(
Expression.Property(parameter, "MyStringField"),
"StartsWith",
null,
Expression.Constant("MyValue")
),
Expression.GreaterThanOrEqual(
Expression.Property(parameter, "MyNullableIntField"),
Expression.Convert(Expression.Constant(12), typeof(int?))
)
),
parameter
);