Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

when and in what scenario to use Expression Tree

Tags:

c#

linq

I was reading about Expression Tree feature and how you can create delegates using lambda expressions. I still can't get as to in what scenario it is useful and in what real world example should I use it.

like image 522
DotNetInfo Avatar asked Aug 20 '10 06:08

DotNetInfo


People also ask

Where is the expression tree used?

Expression Trees provide richer interaction with the arguments that are functions. You write function arguments, typically using Lambda Expressions, when you create LINQ queries. In a typical LINQ query, those function arguments are transformed into a delegate the compiler creates.

What is expression tree explain with example?

Expression Tree is a special kind of binary tree with the following properties: Each leaf is an operand. Examples: a, b, c, 6, 100. The root and internal nodes are operators. Examples: +, -, *, /, ^

What is the role of expression trees in LINQ?

You can compile and run code represented by expression trees. This enables dynamic modification of executable code, the execution of LINQ queries in various databases, and the creation of dynamic queries. For more information about expression trees in LINQ, see How to use expression trees to build dynamic queries (C#).

What do you mean by expression tree?

An expression tree is a representation of expressions arranged in a tree-like data structure. In other words, it is a tree with leaves as operands of the expression and nodes contain the operators. Similar to other data structures, data interaction is also possible in an expression tree.


2 Answers

Aside from LINQ, another very simple use case is to extract both the name and the value of a property. I use this in a fluent API for validating data transfer objects. It's safer to pass one lambda parameter to define both name and value rather than have a second string parameter for the name, and run the risk of developers getting it wrong.

Here's an example (minus all the safety checks and other housekeeping):

public Validator<T> Check<T>(Expression<Func<T>> expr) {
    // Analyse the expression as data
    string name = ((MemberExpression) expr.Body).Member.Name;
    // Compile and execute it to get the value
    T value = (expr.Compile())();
    return new Validator<T>(name, value);
}

Example of use:

Check(() => x.Name).NotNull.MinLength(1);
Check(() => x.Age).GreaterThan(18);
like image 82
Christian Hayter Avatar answered Oct 17 '22 20:10

Christian Hayter


The primary use for expression trees is for out-of-process LINQ providers such as LINQ to SQL.

When you write something like this:

var query = people.Where(x => x.Age > 18)
                  .Select(x => x.Name);

those lambda expressions can either be converted to delegates, which can then be executed (as they are in LINQ to Object) or they can be converted to expression trees, which can be analyzed by the query source and acted on accordingly (e.g. by turning them into SQL, web service calls etc). The difference is that expression trees represent the code as data. They can be compiled into delegates if necessary, but usually (within LINQ anyway) they're never executed directly - just examined to find out the logic they contain.

Expression trees are also used extensively in the Dynamic Language Runtime, where they represent the code which should execute when a dynamic expression is evaluated. Expression trees are well suited for this as they can be composed and broken down again, and after they're compiled the resulting IL is JIT-compiled as normal.

Most developers will never need to mess with the expression tree API, although it has a few other uses.

like image 40
Jon Skeet Avatar answered Oct 17 '22 21:10

Jon Skeet