Как расширить вызывающие выражения, отличные от предикатов?

Я только что обнаружил LINQKit и очень доволен тем, что он, кажется, обеспечивает решение общей проблемы, связанной с желанием выделить части сложных запросов linq.

Однако все примеры показывают, как исключить предикаты для предложений where.

Хотя это очень типичный вариант использования, я также хочу исключить другие виды выражений, обычно для выбора. Скажем, у меня есть следующее подвыражение:

    Expression<Func<SomeFunkyEntity, String>> GetStatusFromSomeFunkyEntity()
    {
        return i =>
            i.IsExercise ? "Excercise" :
            i.IsExpired ? "Expired" :
            (i.IsLocked ) ? "Locked" :
            i.IsAdmitted ? "Admissible" : "Unusable";
    }

Предоставляет ли LINQKit способ расширения вызова до этого? Я попытался:

var query =
    from i in this.DbContext.MyFunkyEntities.AsExpandable()
    select new SomeFunkyEntityWithStatus()
    {
        FunkyEntity = i,
        Status = GetStatusFromSomeFunkyEntity().Invoke(i)
    };

Это соответствует, но не работает во время выполнения в расширителе LINQKit:

Unable to cast object of type 'System.Linq.Expressions.InstanceMethodCallExpressionN' to type 'System.Linq.Expressions.LambdaExpression'.

Трассировка стека начинается с:

at LinqKit.ExpressionExpander.VisitMethodCall(MethodCallExpression m)
at LinqKit.ExpressionVisitor.Visit(Expression exp)
at LinqKit.ExpressionVisitor.VisitMemberAssignment(MemberAssignment assignment)
...

Это не поддерживается или я что-то не так делаю?


person John    schedule 18.01.2014    source источник


Ответы (1)


Вы пытались присвоить выражение локальной переменной перед вызовом вызова?

var statusFromSomeFunkyEntity = GetStatusFromSomeFunkyEntity();

var query =
    from i in this.DbContext.MyFunkyEntities.AsExpandable()
    select new SomeFunkyEntityWithStatus()
    {
        FunkyEntity = i,
        Status = statusFromSomeFunkyEntity.Invoke(i)
    };

Ознакомьтесь с этим ответом.

person Lucas Corsaletti    schedule 21.01.2014
comment
Да! Большое спасибо! Действительно, еще один случай той другой проблемы, которую я помню, читал, но, по-видимому, не усвоил должным образом. - person John; 22.01.2014