public void AddInsertClause(HqlIdent target, HqlRange columnSpec) { var into = _insertRoot.NodesPreOrder.OfType <HqlInto>().Single(); into.AddChild(target); into.AddChild(columnSpec); }
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()); }
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)); }
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)); }