views:

471

answers:

3

I will keep it really simple,

How do I get expression tree out of lambda??

or from query expression ?

+11  A: 

You must assign the lambda to a different type:

// Gives you a lambda:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => x * 2;

The same goes for method arguments. However, once you've assigned such a lambda expression to a Func<> type, you can't get the expression tree back.

Konrad Rudolph
+5  A: 

Konrad's reply is exact. You need to assign the lambda expression to Expression<Func<...>> in order for the compiler to generate the expression tree. If you get a lambda as a Func<...>, Action<...> or other delegate type, all you have is a bunch of IL instructions.

If you really need to be able to convert an IL-compiled lambda back into an expression tree, you'd have to decompile it (e.g. do what Lutz Roeder's Reflector tool does). I'd suggest having a look at the Cecil library, which provides advanced IL manipulation support and could save you quite some time.

Pierre
thanks Pierre... link is quite helpfull :)
Prashant
So you are really trying to decompile a piece of IL to an expression tree!? I suppose you can't force your users to provide you the lambda as an expression tree, then. Sad.
Pierre
+1  A: 

I thought this really helped with problem Lambda Expressions It starts off with the basics but then does converting to expression tree, converting expression tree back to lambda and then creating an expression tree from scratch.

mikej