public override bool InitializeOutputFields()
        {
            CacheTable = PrimaryTransform.CacheTable.Copy();

            //add the operation type, which indicates whether record is rejected 'R' or 'C/U/D' create/update/delete
            if (CacheTable.Columns.SingleOrDefault(c => c.DeltaType == TableColumn.EDeltaType.DatabaseOperation) == null)
            {
                CacheTable.Columns.Insert(0, new TableColumn("Operation", ETypeCode.Byte)
                {
                    DeltaType = TableColumn.EDeltaType.DatabaseOperation
                });
            }

            //add the rejection reason, which details the reason for a rejection.
            if (CacheTable.Columns.SingleOrDefault(c => c.DeltaType == TableColumn.EDeltaType.RejectedReason) == null)
            {
                CacheTable.Columns.Add(new TableColumn("RejectReason", ETypeCode.String)
                {
                    DeltaType = TableColumn.EDeltaType.RejectedReason
                });
            }

            //add the rejection reason, which details the reason for a rejection.
            if (CacheTable.Columns.SingleOrDefault(c => c.DeltaType == TableColumn.EDeltaType.ValidationStatus) == null)
            {
                CacheTable.Columns.Add(new TableColumn("ValidationStatus", ETypeCode.String)
                {
                    DeltaType = TableColumn.EDeltaType.ValidationStatus
                });
            }

            //store reject column details to improve performance.
            _rejectReasonOrdinal = CacheTable.GetDeltaColumnOrdinal(TableColumn.EDeltaType.RejectedReason);
            if (_rejectReasonOrdinal >= 0)
            {
                _rejectReasonColumnName = CacheTable.Columns[_rejectReasonOrdinal].Name;
            }

            _operationOrdinal        = CacheTable.GetDeltaColumnOrdinal(TableColumn.EDeltaType.DatabaseOperation);
            _validationStatusOrdinal = CacheTable.GetDeltaColumnOrdinal(TableColumn.EDeltaType.ValidationStatus);

            _primaryFieldCount = PrimaryTransform.FieldCount;
            _columnCount       = CacheTable.Columns.Count;
            _mapFieldOrdinals  = new List <int>();
            for (var i = 0; i < _primaryFieldCount; i++)
            {
                _mapFieldOrdinals.Add(GetOrdinal(PrimaryTransform.GetName(i)));
            }



            return(true);
        }
        private object[] GetRow(DynamicTableEntity currentEntity)
        {
            var row = new object[CacheTable.Columns.Count];

            var partitionKeyOrdinal = CacheTable.GetDeltaColumnOrdinal(TableColumn.EDeltaType.AzurePartitionKey);

            if (partitionKeyOrdinal >= 0)
            {
                row[partitionKeyOrdinal] = currentEntity.PartitionKey;
            }

            var rowKeyOrdinal = CacheTable.GetDeltaColumnOrdinal(TableColumn.EDeltaType.AzureRowKey);

            if (rowKeyOrdinal >= 0)
            {
                row[rowKeyOrdinal] = currentEntity.RowKey;
            }

            var timestampOrdinal = CacheTable.GetDeltaColumnOrdinal(TableColumn.EDeltaType.TimeStamp);

            if (timestampOrdinal >= 0)
            {
                row[timestampOrdinal] = currentEntity.Timestamp;
            }

            foreach (var value in currentEntity.Properties)
            {
                var returnValue = value.Value.PropertyAsObject;
                if (returnValue == null)
                {
                    row[CacheTable.GetOrdinal(value.Key)] = DBNull.Value;
                }
                else
                {
                    row[CacheTable.GetOrdinal(value.Key)] = _connection.ConvertEntityProperty(CacheTable[value.Key].DataType, returnValue);
                }
            }

            return(row);
        }