Beispiel #1
0
        public override ISqlFragment Visit(NewInstancePredicate e)
        {
            Check.NotNull(e, "e");

            if (BuiltInTypeKind.CollectionType == e.ResultType.EdmType.BuiltInTypeKind)
            {
                return(VisitCollectionConstructor(e));
            }
            throw new NotSupportedException();
        }
Beispiel #2
0
        private ISqlFragment VisitNewInstanceExpression(NewInstancePredicate e, bool aliasesNeedRenaming, out Dictionary <string, Symbol> newColumns)
        {
            var result  = new SqlBuilder();
            var rowType = e.ResultType.EdmType as RowType;

            if (null != rowType)
            {
                newColumns = new Dictionary <string, Symbol>(e.Arguments.Count);

                var members   = rowType.Properties;
                var separator = "";
                for (var i = 0; i < e.Arguments.Count; ++i)
                {
                    var argument = e.Arguments[i];
                    if (BuiltInTypeKind.RowType == argument.ResultType.EdmType.BuiltInTypeKind)
                    {
                        throw new NotSupportedException();
                    }

                    var member = members[i];
                    result.Append(separator);
                    result.AppendLine();
                    result.Append(argument.Accept(this));
                    result.Append(" AS ");
                    if (aliasesNeedRenaming)
                    {
                        var column = new Symbol(member.Name, member.TypeUsage);
                        column.NeedsRenaming = true;
                        column.NewName       = String.Concat("Internal_", member.Name);
                        result.Append(column);
                        newColumns.Add(member.Name, column);
                    }
                    else
                    {
                        result.Append(QuoteIdentifier(member.Name));
                    }
                    separator = ", ";
                }
            }
            else
            {
                throw new NotSupportedException();
            }

            return(result);
        }
Beispiel #3
0
        private ISqlFragment VisitCollectionConstructor(NewInstancePredicate e)
        {
            if (e.Arguments.Count == 1 && e.Arguments[0].PredicateType == PredicateType.Element)
            {
                var elementExpr = e.Arguments[0] as ElementPredicate;
                var result      = VisitExpressionEnsureSqlStatement(elementExpr.Argument);

                if (!IsCompatible(result, PredicateType.Element))
                {
                    Symbol fromSymbol;
                    var    inputType = elementExpr.Argument.ResultType.GetElementTypeUsage();

                    result = CreateNewSelectStatement(result, "element", inputType, out fromSymbol);
                    AddFromSymbol(result, "element", fromSymbol, false);
                }
                result.Select.Top = new TopClause(1, false);
                return(result);
            }

            var collectionType  = (CollectionType)e.ResultType.EdmType;
            var isScalarElement = BuiltInTypeKind.PrimitiveType == collectionType.TypeUsage.EdmType.BuiltInTypeKind;

            var resultSql = new SqlBuilder();
            var separator = "";

            if (e.Arguments.Count == 0)
            {
                //resultSql.Append(" SELECT CAST(null as ");
                //resultSql.Append(GetSqlPrimitiveType(collectionType.TypeUsage));
                //resultSql.Append(") AS X FROM (SELECT 1) AS Y WHERE 1=0");
            }

            foreach (var arg in e.Arguments)
            {
                resultSql.Append(separator);
                resultSql.Append(" SELECT ");
                resultSql.Append(arg.Accept(this));
                if (isScalarElement)
                {
                    resultSql.Append(" AS X ");
                }
                separator = " UNION ALL ";
            }

            return(resultSql);
        }