I'm reading code abour how to building an IQueryable Provider
Below is code fragment
internal class QueryTranslator : ExpressionVisitor
{
.....
private static Expression StripQuotes(Expression e)
{
while (e.NodeType == ExpressionType.Quote)
{
e = ((UnaryExpression)e).Operand;
}
return e;
}
protected override Expression VisitMethodCall(MethodCallExpression m)
{
if (m.Method.DeclaringType == typeof(Queryable))
{
if (m.Method.Name == "Where")
{
sb.Append("SELECT * FROM (");
this.Visit(m.Arguments[0]);
sb.Append(") AS T WHERE ");
LambdaExpression lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);
this.Visit(lambda.Body);
return m;
}
else if (m.Method.Name == "Select")
{
LambdaExpression lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);
ColumnProjection projection = new ColumnProjector().ProjectColumns(lambda.Body, this.row);
sb.Append("SELECT ");
sb.Append(projection.Columns);
sb.Append(" FROM (");
this.Visit(m.Arguments[0]);
sb.Append(") AS T ");
this.projection = projection;
return m;
}
}
throw new NotSupportedException(string.Format("The method '{0}' is not supported", m.Method.Name));
}
.....
}
I can't understand method StripQuotes, What I get from e = ((UnaryExpression)e).Operand ?