Exemplo n.º 1
0
        protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression)
        {
            switch (expression.NodeType)
            {
            case ExpressionType.Negate:
                return(_hqlTreeBuilder.Negate(VisitExpression(expression.Operand).AsExpression()));

            case ExpressionType.UnaryPlus:
                return(VisitExpression(expression.Operand).AsExpression());

            case ExpressionType.Not:
                return(_hqlTreeBuilder.BooleanNot(VisitExpression(expression.Operand).ToBooleanExpression()));

            case ExpressionType.Convert:
            case ExpressionType.ConvertChecked:
            case ExpressionType.TypeAs:
                if ((expression.Operand.Type.IsPrimitive || expression.Operand.Type == typeof(Decimal)) &&
                    (expression.Type.IsPrimitive || expression.Type == typeof(Decimal)))
                {
                    return(_hqlTreeBuilder.Cast(VisitExpression(expression.Operand).AsExpression(), expression.Type));
                }

                return(VisitExpression(expression.Operand));
            }

            throw new NotSupportedException(expression.ToString());
        }
Exemplo n.º 2
0
        protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression)
        {
            switch (expression.NodeType)
            {
            case ExpressionType.Negate:
                return(_hqlTreeBuilder.Negate(VisitExpression(expression.Operand).AsExpression()));

            case ExpressionType.UnaryPlus:
                return(VisitExpression(expression.Operand).AsExpression());

            case ExpressionType.Not:
                return(_hqlTreeBuilder.BooleanNot(VisitExpression(expression.Operand).ToBooleanExpression()));

            case ExpressionType.Convert:
            case ExpressionType.ConvertChecked:
            case ExpressionType.TypeAs:
                return(IsCastRequired(expression.Operand, expression.Type, out var existType)
                                                ? _hqlTreeBuilder.Cast(VisitExpression(expression.Operand).AsExpression(), expression.Type)
                       // Make a transparent cast when an IType exists, so that it can be used to retrieve the value from the data reader
                                                : existType && HqlIdent.SupportsType(expression.Type)
                                                        ? _hqlTreeBuilder.TransparentCast(VisitExpression(expression.Operand).AsExpression(), expression.Type)
                                                        : VisitExpression(expression.Operand));
            }

            throw new NotSupportedException(expression.ToString());
        }
Exemplo n.º 3
0
        protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression)
        {
            switch (expression.NodeType)
            {
            case ExpressionType.Negate:
                return(_hqlTreeBuilder.Negate(VisitExpression(expression.Operand).AsExpression()));

            case ExpressionType.UnaryPlus:
                return(VisitExpression(expression.Operand).AsExpression());

            case ExpressionType.Not:
                return(_hqlTreeBuilder.BooleanNot(VisitExpression(expression.Operand).ToBooleanExpression()));

            case ExpressionType.Convert:
            case ExpressionType.ConvertChecked:
            case ExpressionType.TypeAs:
                var castable = !_notCastableExpressions.TryGetValue(expression, out var castType);
                if (castable)
                {
                    castType = expression.Type;
                }

                return(IsCastRequired(expression.Operand, castType, out var needTransparentCast) && castable
                                                ? _hqlTreeBuilder.Cast(VisitExpression(expression.Operand).AsExpression(), castType)
                       // Make a transparent cast when an IType exists, so that it can be used to retrieve the value from the data reader
                                                : needTransparentCast
                                                        ? _hqlTreeBuilder.TransparentCast(VisitExpression(expression.Operand).AsExpression(), castType)
                                                        : VisitExpression(expression.Operand));
            }

            throw new NotSupportedException(expression.ToString());
        }
Exemplo n.º 4
0
        public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection <Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
        {
            // All has two arguments.  Arg 1 is the source and arg 2 is the predicate
            var predicate = (LambdaExpression)arguments[1];

            return(treeBuilder.BooleanNot(
                       treeBuilder.Exists(
                           treeBuilder.Query(
                               treeBuilder.SelectFrom(
                                   treeBuilder.From(
                                       treeBuilder.Range(
                                           visitor.Visit(arguments[0]),
                                           treeBuilder.Alias(predicate.Parameters[0].Name))
                                       )
                                   ),
                               treeBuilder.Where(
                                   treeBuilder.BooleanNot(visitor.Visit(arguments[1]).ToBooleanExpression())
                                   )
                               )
                           )
                       ));
        }
Exemplo n.º 5
0
        protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression)
        {
            switch (expression.NodeType)
            {
            case ExpressionType.Not:
                return(_hqlTreeBuilder.BooleanNot(VisitExpression(expression.Operand).AsBooleanExpression()));

            case ExpressionType.Convert:
                return(VisitExpression(expression.Operand));
            }

            throw new NotSupportedException(expression.ToString());
        }
Exemplo n.º 6
0
        public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection <Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
        {
            HqlExpression value        = visitor.Visit(arguments[0]).AsExpression();
            HqlTreeNode   inClauseNode = BuildInClause(arguments, treeBuilder, visitor);

            HqlTreeNode inClause = treeBuilder.In(value, inClauseNode);

            if (method.Name == "NotIn")
            {
                inClause = treeBuilder.BooleanNot((HqlBooleanExpression)inClause);
            }

            return(inClause);
        }
Exemplo n.º 7
0
        protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression)
        {
            switch (expression.NodeType)
            {
            case ExpressionType.Not:
                return(_hqlTreeBuilder.BooleanNot(VisitExpression(expression.Operand).AsBooleanExpression()));

            case ExpressionType.Convert:
            case ExpressionType.ConvertChecked:
            {
                if (expression.Operand.Type.IsPrimitive && expression.Type.IsPrimitive)
                {
                    return(_hqlTreeBuilder.Cast(VisitExpression(expression.Operand).AsExpression(), expression.Type));
                }

                return(VisitExpression(expression.Operand));
            }
            }

            throw new NotSupportedException(expression.ToString());
        }
Exemplo n.º 8
0
        public override HqlTreeNode BuildHql(MethodInfo method, System.Linq.Expressions.Expression targetObject, ReadOnlyCollection <System.Linq.Expressions.Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
        {
            var         value = visitor.Visit(arguments[0]).AsExpression();
            HqlTreeNode inClauseNode;

            if (arguments[1] is ConstantExpression)
            {
                inClauseNode = BuildFromArray((Array)((ConstantExpression)arguments[1]).Value, treeBuilder);
            }
            else
            {
                inClauseNode = BuildFromExpression(arguments[1], visitor);
            }

            HqlTreeNode inClause = treeBuilder.In(value, inClauseNode);

            if (method.Name == "NotIn")
            {
                inClause = treeBuilder.BooleanNot((HqlBooleanExpression)inClause);
            }

            return(inClause);
        }