25

I'm dynamically building linq queries for nHibernate.

Due to dependencies, I wanted to cast/retrieve the typed expression at a later time, but I have been unsuccessfull so far.

This is not working (the cast is supposed to happen elsewhere):

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

This is working:

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

Is it possible to get the 'encapsulated' typed expression from a LambdaExpression?

Larantz
  • 253
  • 1
  • 3
  • 5

1 Answers1

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

This is not surprising, as you have to Compile a LambdaExpression in order to get an actual delegate that can be invoked (which is what Func<T, bool> is).

So this would work, but I 'm not sure if it is what you need:

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

If you are not looking to compile the expression but instead to move an expression tree around, then the solution is to instead cast to an Expression<Func<T, bool>>:

var typedExpression = (Expression<Func<T, bool>>) 
                      Expression.Lambda(funcType, itemPredicate, parameter);
Jon
  • 428,835
  • 81
  • 738
  • 806
  • Thanks for reply. Yes I'm looking to move the expression tree around. The problem is the cast which you're refering to `Expression> typedExpression = Expression.Lambda(funcType, itemPredicate, parameter);` This results in `Cannot convert souce type System.Linq.Expressions.LambdaExpression to target type System.Linq.Expressions.Expression>` – Larantz Apr 26 '13 at 06:44
  • @Larantz: Sorry, my mistake; I forgot that you need to cast explicitly. Check out the updated answer. – Jon Apr 26 '13 at 08:22
  • 1
    Thank you. I can not belive how blind I was not to notice that I was lacking the Expression<> part of the cast :). – Larantz Apr 26 '13 at 10:45
  • Explicit cast `var typedExpression = (Expression>) (...)` solved my similar issue. – Lars Gyrup Brink Nielsen Oct 04 '16 at 12:23