2013-04-25 20 views
15

Dynamicznie buduję zapytania linq dla nHibernate.Jak przekonwertować wyrażenie Lambda do wpisanego wyrażenia <Func<T, T>>

Ze względu na zależności, chciałem rzucić/odzyskać wpisane wyrażenie w późniejszym czasie, ale jak dotąd nie udało mi się.

To nie działa (obsada ma się zdarzyć w innym miejscu):

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

to działa:

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

Czy to możliwe, aby uzyskać 'obudowane' wpisane wyrażenie z LambdaExpression ?

+0

może szukasz typedExpression.Compile() – jure

+1

muszę użyć wyrażenia jako IQueryable z mojego ORM odwzorowującym więc nie może być skompilowany. – Larantz

Odpowiedz

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

Nie jest to zaskakujące, ponieważ trzeba CompileLambdaExpression w celu uzyskania rzeczywistej delegata, który może być wywołany (czego Func<T, bool> jest).

Więc to będzie działać, ale nie jestem pewien, czy to jest to, czego potrzebujesz:

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

Jeśli nie szukasz skompilować wyrażenie ale zamiast przenieść drzewa wyrażenie dookoła, następnie roztwór jest, aby zamiast rzucać do Expression<Func<T, bool>>:

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

Dzięki za odpowiedź. Tak, chcę przenieść drzewo wyrażeń wokół. Problem stanowi rzutowanie, do którego odnosi się wyrażenie "Wyrażenie > typedExpression = Expression.Lambda (funcType, itemPredicate, parameter);" To powoduje, że 'Nie można skonwertować typu souku System.Linq.Expressions.LambdaExpression na typ celu System.Linq.Expressions.Expression > ' – Larantz

+0

@Larantz: Przepraszam, mój błąd; Zapomniałem, że musisz rzucić bezpośrednio. Sprawdź zaktualizowaną odpowiedź. – Jon

+1

Dziękuję. Nie mogę uwierzyć, jak ślepy nie zauważyłem, że brakowało mi Expression <> części obsady :). – Larantz

Powiązane problemy