Если типы TProperty могут отличаться, и если вы хотите сделать их разными, то вам потребуется несколько перегрузок.
T Get<TProperty>(int id, Expression<Func<T, TProperty>> include) { ... }
T Get<TProperty1, TProperty2>(int id, Expression<Func<T, TProperty1>> include1, Expression<Func<T, TProperty2>> include2)
ИЛИ вы можете использовать:
T Get(int id, params Expression<Func<T, object>>[] includes)
И полагаться на ковариацию универсального делегата Func, но тогда вам придется справиться с фактомвы теряете немного безопасности типов.
Поскольку Func является ковариацией по типу возвращаемого значения, это означает, что если ваш делегат ожидает возврата объекта, вы все равно можете передать ему делегат с более узким типом возврата (хотя и с предупреждением, с типами значений ковариантности ковариантно не совместимы с объектом, только ссылочные типы).