2014-01-18 22 views
2

我剛剛發現了LINQKit,並且很高興看到它似乎爲想要分解出複雜的linq查詢部分的常見問題提供了一個解決方案。如何擴展謂詞以外的調用表達式?

但是,所有示例都顯示瞭如何分解謂詞的where-clause。

雖然這是一個非常典型的用例,但我還想將其他類型的表達式(通常用於選擇)進行分解。假設我有以下子表達式:

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

這是不支持的,還是我做的有問題?

回答

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

+0

是的!非常感謝!事實上,我記得曾經讀過的另一個問題是,但顯然沒有正確內化。 – John