protected override Expression VisitBinary(BinaryExpression expr)
        {
            BinaryExpressionTypeFinder left = new BinaryExpressionTypeFinder();
            left.Visit(expr.Left);

            if (left.Type == BinaryCriterionType.None)
                return base.VisitBinary(expr);

            BinaryExpressionTypeFinder right = new BinaryExpressionTypeFinder();
            right.Visit(expr.Right);

            if (right.Type == BinaryCriterionType.None)
                return base.VisitBinary(expr);

            if (right.Type == BinaryCriterionType.Property)
            {
                if (left.Type == BinaryCriterionType.Criteria
                    || left.Type == BinaryCriterionType.Value)
                {
                    return Swap(expr);
                }
            }
            else if (right.Type == BinaryCriterionType.Value)
            {
                if (left.Type == BinaryCriterionType.Criteria)
                {
                    return Swap(expr);
                }
            }

            return expr;
        }
        protected override Expression VisitBinary(BinaryExpression expr)
        {
            BinaryExpressionTypeFinder left = new BinaryExpressionTypeFinder();

            left.Visit(expr.Left);

            if (left.Type == BinaryCriterionType.None)
            {
                return(base.VisitBinary(expr));
            }

            BinaryExpressionTypeFinder right = new BinaryExpressionTypeFinder();

            right.Visit(expr.Right);

            if (right.Type == BinaryCriterionType.None)
            {
                return(base.VisitBinary(expr));
            }


            if (right.Type == BinaryCriterionType.Property)
            {
                if (left.Type == BinaryCriterionType.Criteria ||
                    left.Type == BinaryCriterionType.Value)
                {
                    return(Swap(expr));
                }
            }
            else if (right.Type == BinaryCriterionType.Value)
            {
                if (left.Type == BinaryCriterionType.Criteria)
                {
                    return(Swap(expr));
                }
            }

            return(expr);
        }