This is another post about C# basics :)
Our code sample is like following:

What we have here is Func ‘f’ and Expression ‘e1’ initialized with same value (x, y) => (x + y) * 2
Lines 21,22 and 23 will all print the same output: 6.
So what is the difference between Func and Expression?
At first it may seem strange why there are 2 similar concepts. It’s possible to initialize both Func and Expression with Lambda Expressions.
Func (and Action as well) is a delegate and Expression is a binary tree
The screen below shows how Func<int, int, int> looks like. As you can notice method property is set. Func<int, int, int> knows what piece of code to run when it is executed. It does not know anything about the code structure inside assigned lambda expression.

Expression on the other side has Body and two sides: Left and Right. This structure is aware of assigned lambda expression structure. Every logical operation is represented by new node.

The last screen shows left node from the parent structure. As you can see it contains its own Left and Right nodes populated with expressions.

Building Expressions manually
On the first screen (lines 14-19) you could spot that it is possible to build Expression Trees manually. This is very convenient way to create for example business rules in Business Rule Engines.

Serialization
Why would you want to serialize Func/Expression? One sample is when you want to query a remote location. Good practice is to send filter over network. Such filter can be extended without altering interfaces with new parameters over and over again.
One thing worth mentioning is that only Expression can be serialized. Of course it depends strongly what you implement inside, but in general serialization is possible. Func, due to its nature (meaning the Method property) can not be serialized.