internal class QuerySourceReferencePropertyTransformingTreeVisitor : RelinqExpressionVisitor
{
private MemberExpression parent;
private DSLFieldExpression queryField;
protected override Expression VisitMember(MemberExpression expression)
{
parent = expression;
var result = base.VisitMember(expression);
return queryField ?? result;
}
protected override Expression VisitQuerySourceReference(QuerySourceReferenceExpression expression)
{
var propertyInfo = parent.Member as PropertyInfo;
if (propertyInfo == null)
{
throw new NotSupportedException("Only MemberExpression of type PropertyInfo may be used on QuerySourceReferenceExpression.");
}
var propertyType = propertyInfo.PropertyType;
if (propertyType.IsEnum)
{
propertyType = Enum.GetUnderlyingType(propertyType);
}
queryField = new DSLFieldExpression (propertyInfo.Name, propertyType);
return base.VisitQuerySourceReference(expression);
}
}