Un'altro interessante metodo della classe System.Query.QueryExpression (presente nell'assembly System.Query.dll della preview di LINQ) è Parse: riceve in input una espressione (e gli eventuali argomenti) sotto forma di stringa e restituisce in output un oggetto Expression, ovvero una rappresentazione ad oggetti della stessa. Si consideri il seguente codice:

using System;
using System.Collections.Generic;
using System.Text;
using System.Query;
using System.Expressions;

class ExpressionBuilder
{
  
private Expression expression;
  
private ParameterExpression[] parameters;

   public ExpressionBuilder(string expression, params ParameterExpression[] parameters)
  
{
     
this.parameters = parameters;
     
if (parameters == null || parameters.Length == 0)
     
{
        
this.expression = QueryExpression.Parse(expression);
        
return;
     
}

      Dictionary<string, Expression> scope = new Dictionary<string, Expression>();
     
foreach (ParameterExpression parameter in parameters)
     
{
        
ParameterExpression tmp = Expression.Parameter(parameter.Type, parameter.Name);
        
scope.Add(tmp.Name, tmp);
     
}

      this.expression = QueryExpression.Parse(expression, scope); // Parsing!
   }

   public override string ToString()
  
{
     
StringBuilder sb = new StringBuilder();
     
expression.BuildString(sb);
     
return sb.ToString();
  
}
}

La classe ExpressionBuilder è un semplice wrapper su alcune funzionalità di QueryExpression. Data la classe precedente è quindi possibile scrivere cose del tipo:

ExpressionBuilder expr = new ExpressionBuilder(
  
"(x + y) * 2",
  
new ParameterExpression[]
  
{
      
Expression.Parameter(typeof(int), "x")
     
,Expression.Parameter(typeof(int), "y")
  
}
);

Console.WriteLine(expr);  // Multiply(Add(x, y), 2)