如何扩展除谓词之外的调用表达式?

时间:2014-01-18 16:38:51

标签: c# linq entity-framework expression-trees linqkit

我刚刚发现了LINQKit,我很高兴它似乎为想要分解复杂linq查询部分的常见问题提供了解决方案。

但是,所有示例都显示了如何将谓词分解为where-clauses。

虽然这是一个非常典型的用例,但我也想分析其他类型的表达式,通常用于选择。假设我有以下子表达式:

    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)
...

这不支持,还是我做错了什么?

1 个答案:

答案 0 :(得分:3)

在调用invoke之前,您是否尝试将表达式赋值给局部变量?

var statusFromSomeFunkyEntity = GetStatusFromSomeFunkyEntity();

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

查看this answer