2013-04-25 112 views
15

我正在爲nHibernate動態構建linq查詢。如何將LambdaExpression轉換爲鍵入的表達式<Func<T, T>>

由於依賴關係,我想在以後的時間輸入/檢索類型化表達式,但到目前爲止我一直沒有成功。

這不是工作(中投應該在別處發生):

var funcType = typeof (Func<,>).MakeGenericType(entityType, typeof (bool)); 
var typedExpression = (Func<T, bool>)Expression.Lambda(funcType, itemPredicate, parameter); //Fails 

這是工作:

var typedExpression = Expression.Lambda<Func<T, bool>>(itemPredicate, parameter); 

是否有可能得到「封裝」從LambdaExpression輸入表達式?

+0

也許你正在尋找typedExpression.Compile() – jure 2013-04-25 11:07:04

+1

我需要使用表達式作爲一個IQueryable與我的ORM映射器,因此它不能被編譯。 – Larantz 2013-04-26 07:52:53

回答

24
var typedExpression = 
    (Func<T, bool>)Expression.Lambda(funcType, itemPredicate, parameter); //Fails 

這並不奇怪,因爲你爲了獲得可以調用的實際委託(這是什麼Func<T, bool>是)必須Compile一個LambdaExpression

所以這會工作,但我不知道這是否是你所需要的:

// This is no longer an expression and cannot be used with IQueryable 
var myDelegate = 
    (Func<T, bool>) 
    Expression.Lambda(funcType, itemPredicate, parameter).Compile(); 

如果你不希望編譯表達式,而是四處移動的表達式目錄樹,那麼解決方案是改爲強制轉換爲Expression<Func<T, bool>>

var typedExpression = (Expression<Func<T, bool>>) 
         Expression.Lambda(funcType, itemPredicate, parameter); 
+0

感謝您的回覆。 是的我正在尋找移動表達式樹。 問題是你正在引用的表達式類型表達式= Expression.Lambda(funcType,itemPredicate,parameter);'這會導致 '無法將源類型System.Linq.Expressions.LambdaExpression轉換爲目標類型System.Linq.Expressions.Expression >' – Larantz 2013-04-26 06:44:29

+0

@Larantz:對不起,我的錯誤;我忘了你需要明確施放。查看更新後的答案。 – Jon 2013-04-26 08:22:25

+1

謝謝。 我不能相信我是多麼的盲目,我沒有注意到我缺少表演<>部分演員:)。 – Larantz 2013-04-26 10:45:28

相關問題