C# Expression trees

Expression trees worden gebruikt in combinatie met LINQ. Een expression tree is een abstracte representatie van een lambda expressie. Een expression tree kan niet direct worden uitgevoerd. Met de compile() methode wordt in het geheugen de representatie gemaakt in de vorm van een object. Vervolgens kan via code de expressie worden benaderd. Zo gebuikt LINQ2SQL expression trees om de lambda code om te zetten naar een SQL querie. Dit is mogelijk omdat alle onderdelen (de nodes van de tree) van de lambda uitgelezen kunnen worden. Stel je deze lambda voor:
x => x.Name == "Martijn"
Deze expressie bevat een Body en de body bestaat uit de volgende onderdelen:
  1. Left property: Deze bevat de linkerkant van de expressie (x.Name)
  2. Right property: Deze bevat de rechterkant van de expressie ("Martijn")
  3. NodeType property: bevat de operatie die toegepast is op de twee expressies (==)
Normaal gesproken (zeker bij uitgebreide lambda's) worden deze properties achterhaald door gebruik te maken van reflection.

Voorbeeldcode:
public string Test(Expression<Func<Customer, bool>> tree)
{
  string result = "Hello, your";

  BinaryExpression binExp = (BinaryExpression)tree.Body;

  MemberExpression left = (MemberExpression)tree.Left;
  // Add 'Name' to the string
  result += left.Member.Name;
  
  if(binExp.NodeType == NodeType.Equals)
    // Add '=' to the result string
    result += "=";
  else
    throw new NotSupportedException("Only '=' is supported!");

  MemberExpression right = (MemberExpression)tree.Left;
  // Add 'Martijn' to the string
  result += right.Value;

  return result;
}
bronnen:
http://marlongrech.wordpress.com/2008/01/08/working-with-expression-trees-part-1/
http://www.abhisheksur.com/2010/09/use-of-expression-trees-in-lamda-c.html

Reacties

Populaire posts van deze blog

[SQL Server] varchar vs nvarchar

MS Sql 70-461: Chapter 5

[C#] Class serialiseren en deserialiseren