2013-04-25 20 views
15

Realizzo dinamicamente query linq per nHibernate.Come convertire un'espressione lambda in un'espressione digitata <Func<T, T>>

A causa delle dipendenze, volevo eseguire il cast/recuperare l'espressione digitata in un secondo momento, ma fino ad ora non ho avuto esito positivo.

Questo non funziona (il cast dovrebbe succedere altrove):

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

Questo è il lavoro:

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

E 'possibile ottenere il 'incapsulato' digitato l'espressione da un LambdaExpression ?

+0

forse siete alla ricerca di typedExpression.Compile() – jure

+1

ho bisogno di usare l'espressione come un IQueryable con la mia ORM mapper in modo che non può essere compilato. – Larantz

risposta

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

questo non è sorprendente, come si deve Compile un LambdaExpression al fine di ottenere un delegato effettivo che può essere richiamato (che è quello che è Func<T, bool>).

Quindi questo avrebbe funzionato, ma io non sono sicuro se è quello che vi serve:

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

Se non siete alla ricerca per compilare l'espressione, ma invece di spostare un albero di espressione intorno, allora la soluzione è quello di lanciare invece un Expression<Func<T, bool>>:

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

Grazie per la risposta. Sì, sto cercando di spostare l'albero delle espressioni. Il problema è il cast, che si sta riferendosi a 'Expression > typedExpression = Expression.Lambda (funcType, itemPredicate, parametro);' Questo si traduce in 'Non può convertire il tipo souce System.Linq.Expressions.LambdaExpression a tipo di destinazione System.Linq.Expressions.Expression > ' – Larantz

+0

@Larantz: Scusa, errore mio; Ho dimenticato che è necessario eseguire il cast esplicito. Controlla la risposta aggiornata. – Jon

+1

Grazie. Non riesco a credere quanto mi sia stato cieco di non notare che mi mancava l'espressione <> parte del cast :). – Larantz

Problemi correlati