protected override Expression VisitMember(MemberExpression expression)
        {
            ArgumentUtility.CheckNotNull("expression", expression);

            // First process any nested expressions
            // E.g, for (kitchen.Cook).FirstName, first process kitchen => newExpression1 (SqlEntity)
            // then newExpression1.Cook => newExpression2 (SqlEntityRef/SqlEntity)
            // then newExpression2.FirstName => result (SqlColumn)

            var sourceExpression = Visit(expression.Expression);
            var resolved         = _stage.ResolveMemberAccess(sourceExpression, expression.Member, _resolver, _context);

            Assertion.DebugAssert(resolved != expression);
            return(Visit(resolved));
        }