Краткий способ написания деревьев выражений с помощью Predicate Builder - PullRequest
1 голос
/ 18 декабря 2011

Есть ли более простой способ написать деревья выражений с помощью Predicate Builder.Кажется, что много кода можно сжать.

Expression<Func<EventGymCourt, object>> gymCourt = q => q.GymCourt;
Expression<Func<EventGymCourt, object>> gym = q => q.GymCourt.Gym;
Expression<Func<EventGymCourt, object>> address = q => q.GymCourt.Gym.Address;

_eventGymCourtRepository.GetWithStart(page, pageSize, new[] { gymCourt, gym, address }....

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

Что ж, я сомневаюсь, что типы членов 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;
}

Хотя это не совсем подходит для вашей ситуации, хорошо иметь в своем инструментарии.

0 голосов
/ 05 апреля 2012

Вы можете проверить Mono.Linq.Expressions от jb evain

0 голосов
/ 19 декабря 2011

Если вы имеете в виду сжатую инициализацию. Вы можете использовать ключевое слово var для переменных деревьев выражений и написать специальный метод расширений ToExpression, который просто возвращает заданное выражение (но необходим компилятору для различения функций и выражений).

...