Exemplo n.º 1
0
        public void AddInsertClause(HqlIdent target, HqlRange columnSpec)
        {
            var into = _insertRoot.NodesPreOrder.OfType <HqlInto>().Single();

            into.AddChild(target);
            into.AddChild(columnSpec);
        }
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
        private bool IsCastRequired(Expression expression, System.Type toType, out bool needTransparentCast)
        {
            needTransparentCast =
                toType != typeof(object) &&
                expression.Type != typeof(object) &&
                expression.Type != toType &&
                HqlIdent.SupportsType(toType) &&
                expression.Type.UnwrapIfNullable() != toType.UnwrapIfNullable();

            return(needTransparentCast && IsCastRequired(ExpressionsHelper.GetType(_parameters, expression), TypeFactory.GetDefaultTypeFor(toType), out needTransparentCast));
        }
Exemplo n.º 4
0
        protected HqlTreeNode VisitConditionalExpression(ConditionalExpression expression)
        {
            var test    = VisitExpression(expression.Test).ToBooleanExpression();
            var ifTrue  = VisitExpression(expression.IfTrue).ToArithmeticExpression();
            var ifFalse = (expression.IfFalse != null
                                                           ? VisitExpression(expression.IfFalse).ToArithmeticExpression()
                                                           : null);

            HqlExpression @case = _hqlTreeBuilder.Case(new[] { _hqlTreeBuilder.When(test, ifTrue) }, ifFalse);

            // If both operands are parameters, HQL will not be able to determine the resulting type before
            // parameters binding. But it has to compute result set columns type before parameters are bound,
            // so an artificial cast is introduced to hint HQL at the resulting type.
            return(expression.Type == typeof(bool) || expression.Type == typeof(bool?) || !HqlIdent.SupportsType(expression.Type)
                                ? @case
                                : _hqlTreeBuilder.TransparentCast(@case, expression.Type));
        }