private void Initialize(NonSelectColumnArgument column, DataType dataTypeDef)
        {
            IsNullable = null;
            CheckNullAndThrow(Arg(() => column, column));
            TryThrow(dataTypeDef.Exception);
            Prev.GetPrev <BeginTableChainer>().SetHasColumns();

            Build = (buildContext, buildArgs) =>
            {
                var sql = Text.GenerateSql(300);
                sql.AppendLine();
                sql.Append(Text.TwoSpaces);

                if (!(Prev is BeginTableChainer && !((BeginTableChainer)Prev).IsDesignedByType))
                {
                    sql.Append(Text.Comma);
                }

                sql.Append(column.Build(buildContext, buildArgs)).S()
                .Append(dataTypeDef.Build());

                TryThrow(column.Exception);

                if (Identity != null)
                {
                    sql.S().Append(Text.Identity)
                    .EncloseLeft()
                    .Append(Identity.Seed)
                    .AppendComma()
                    .Append(Identity.Increment)
                    .EncloseRight();
                }

                if (IsNullable == true)
                {
                    sql.S().Append(Text.Null);
                }
                else if (IsNullable == false)
                {
                    sql.S().Append(Text.NotNull);
                }

                if (Check != null)
                {
                    sql.S().Append(Text.Check)
                    .EncloseLeft().Append(Check.Build(buildContext, buildArgs)).EncloseRight();
                    TryThrow(buildContext);
                }

                if (Default != null)
                {
                    sql.S().Append(Text.Default)
                    .EncloseLeft().Append(Default.Build(buildContext, buildArgs)).EncloseRight();
                    TryThrow(buildContext);
                }

                return(sql.ToString());
            };
        }
        internal BeginTableColumnChainer(Chainer prev, NonSelectColumnArgument column, Type type)
            : base(prev)
        {
            Type clrType;
            var  typeMatch = Mapping.CheckClrCompliance(type, out clrType, out chainException);

            if (typeMatch != Mapping.ClrTypeMatch.ClrMatch)
            {
                TryThrow();
            }

            var dataTypeDef = Mapping.ClrMapping[clrType].DefaultDataType;

            Initialize(column, dataTypeDef);
        }
Esempio n. 3
0
        // unpivot
        internal PivotChainer(Chainer prev,
                              NonSelectColumnArgument valueColumn,
                              NonSelectColumnArgument rotatingColumn,
                              string[] rotatedColumns)
            : base(prev, true)
        {
            _method = Text.Method.Unpivot;

            CheckNullAndThrow(Arg(() => valueColumn, valueColumn));
            CheckNullAndThrow(Arg(() => rotatingColumn, rotatingColumn));
            CheckNullOrEmptyAndThrow(Argc(() => rotatedColumns, rotatedColumns));
            Array.ForEach(rotatedColumns, column => { if (column == null)
                                                      {
                                                          Throw(QueryTalkExceptionType.ArgumentNull, "rotatedColumn = null");
                                                      }
                          });

            Build = (buildContext, buildArgs) =>
            {
                // build IN values
                List <string> columns = new List <string>();
                Array.ForEach(rotatedColumns, column =>
                {
                    columns.Add(Filter.Delimit(column));
                });

                var sql = Text.GenerateSql(300)
                          .NewLine(Text.Unpivot).S()
                          .Append(Text.LeftBracket)
                          .Append(valueColumn.Build(buildContext, buildArgs)).S()
                          .Append(Text.For).S()
                          .Append(rotatingColumn.Build(buildContext, buildArgs)).S()
                          .NewLineIndent(Text.In).S()
                          .Append(Text.LeftBracket)
                          .Append(String.Join(Text.Comma, columns))
                          .Append(Text.RightBracket).Append(Text.RightBracket)
                          .Append(Text._As_).Append(Filter.Delimit(Alias.Name))
                          .ToString();

                TryThrow(buildContext);

                return(sql);
            };
        }
 internal BeginTableColumnChainer(Chainer prev, NonSelectColumnArgument column, DataType dataTypeDef)
     : base(prev)
 {
     Initialize(column, dataTypeDef);
 }