Что ж, я сомневаюсь, что типы членов GymCourt
, Gym
и Address
- все object
, поэтому будет трудно заставить вывод типов работать в вашу пользу.
Один из способов - использовать инициализатор массива:
Expression<Func<EventGymCourt, object>>[] exprs
= { q => q.GymCourt, q => q.GymCourt.Gym, q => q.GymCourt.Gym.Address };
_eventGymCourtRepository.GetWithStart(page, pageSize, exprs);
Если вам действительно нужно каждое выражение в отдельной переменной, вы можете использовать using
-alias для сокращения объявления типа переменной.
// At the top of your file....
using CourtObjectExpr =
System.Linq.Expressions.Expression<System.Func<MyNameSpace.EventGymCourt, object>>;
...
CourtObjectExpr gymCourt = q => q.GymCourt;
CourtObjectExpr gym = q => q.GymCourt.Gym;
CourtObjectExpr address = q => q.GymCourt.Gym.Address;
Кстати, вы, похоже, ищете метод Linq.Expr
из LINQKit (библиотека, содержащая PredicateBuilder
).При этом используются функции вывода типов компилятора для сжатия преобразования лямбда-выражения в дерево выражений в типичных сценариях.Я не думаю, что это все, что полезно в вашем примере, так как вы хотите, чтобы тип возвращаемого выражения был object
, а не тип свойства.
Но при условии , что вы хотитесоздать выражения с типом свойства как типом возврата выражения, которое вы могли бы сделать (весьма кратко):
// Not directly applicable to your scenario (you can add a cast).
var gymCourt = Linq.Expr((EventGymCourt q) => q.GymCourt);
var gym = Linq.Expr((EventGymCourt q) => q.GymCourt.Gym);
var address = Linq.Expr((EventGymCourt q) => q.GymCourt.Gym.Address);
Это позволяет выводу типов компилятора работать в вашу пользу;исходный код метода так же прост:
public static Expression<Func<T, TResult>> Expr<T, TResult>
(Expression<Func<T, TResult>> expr)
{
return expr;
}
Хотя это не совсем подходит для вашей ситуации, хорошо иметь в своем инструментарии.