public override ISqlFragment Visit(NewInstancePredicate e) { Check.NotNull(e, "e"); if (BuiltInTypeKind.CollectionType == e.ResultType.EdmType.BuiltInTypeKind) { return(VisitCollectionConstructor(e)); } throw new NotSupportedException(); }
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); }
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); }