public void GenerateColumnDefinition(SqlQueryBuilder queryBuilder, IEnumerable <ColumnMapping <TEntity> > mappings)
        {
            bool firstColumn = true;

            foreach (ColumnMapping <TEntity> column in mappings)
            {
                if (firstColumn)
                {
                    firstColumn = false;
                }
                else
                {
                    queryBuilder.Append(", ");
                }

                queryBuilder.Append(column.DbColumnName)
                .Append(" ")
                .Append(SqlTypeTranslator.TranslateType <TEntity>(column));

                if (column.IsRequired)
                {
                    queryBuilder.Append(" NOT NULL");
                }
                else
                {
                    queryBuilder.Append(" NULL");
                }
            }
        }
        public void AppendMergeStatement(SqlQueryBuilder queryBuilder)
        {
            queryBuilder.Append(" WHEN MATCHED THEN UPDATE SET ");

            bool isFirst = true;

            foreach (ColumnMapping <TEntity> column in _mappingAdapter.GetColumns().Where(c => !c.IsIdentity))
            {
                if (isFirst)
                {
                    isFirst = false;
                }
                else
                {
                    queryBuilder.Append(", ");
                }

                queryBuilder.Append(TARGET_TABLE_ALIAS)
                .Append(".[")
                .Append(column.DbColumnName)
                .Append("] = ")
                .Append(SOURCE_TABLE_ALIAS)
                .Append(".[")
                .Append(column.DbColumnName)
                .Append("]");
            }
        }
        public (string, IEnumerable <object>) TranslateQuery(MergeStatement <TEntity> mergeQuery)
        {
            var queryBuilder = new SqlQueryBuilder();

            // Merge Statement
            AppendOperation(queryBuilder, "MERGE INTO", tableAlias: TARGET_TABLE_ALIAS);

            // Using Statement
            AppendOperation(queryBuilder, " USING", mergeQuery.TemporaryTableName, SOURCE_TABLE_ALIAS);
            queryBuilder.Append(" ON ");
            AppendMergeJoinKeys(queryBuilder, mergeQuery.Keys);

            // Update Into
            if (mergeQuery.Type == MergeStatement <TEntity> .MergeType.UpdateOnly || mergeQuery.Type == MergeStatement <TEntity> .MergeType.InsertOrUpdate)
            {
                AppendMergeStatement(queryBuilder);
            }

            // Insert Statement
            if (mergeQuery.Type == MergeStatement <TEntity> .MergeType.InsertOnly || mergeQuery.Type == MergeStatement <TEntity> .MergeType.InsertOrUpdate)
            {
                AppendInsertMergeStatement(queryBuilder);
            }

            queryBuilder.Append(";");

            return(queryBuilder.Build());
        }
 public void AppendAliasMember(SqlQueryBuilder queryBuilder, string tableAlias, MemberExpression member)
 {
     // Source
     queryBuilder.Append(tableAlias)
     .Append(".[");
     _statementGeneration.AppendPart(queryBuilder, member);
     queryBuilder.Append("]");
 }
        protected void AppendOperation(SqlQueryBuilder builder, string operation, string tableName = null, string tableAlias = null)
        {
            builder.Append(operation)
            .Append(" ")
            .Append(tableName ?? _mappingAdapter.GetTableName());

            if (tableAlias != null)
            {
                builder.Append(" AS ")
                .Append(tableAlias);
            }
        }
        protected override Expression VisitMember(MemberExpression node)
        {
            string memberName = node.Member.Name;

            ColumnMapping <TEntity> column
                = _mappingAdapter.GetColumns()
                  .First(c => c.PropertyInfo.Name == memberName);

            _queryBuilder.Append(column.DbColumnName);

            return(node);
        }
        public SqlQueryBuilder GenerateCreateQuery(string tableName)
        {
            var queryBuilder = new SqlQueryBuilder();

            AppendOperation(queryBuilder, "CREATE TABLE", tableName);
            queryBuilder.Append(" (");

            GenerateColumnDefinition(queryBuilder, _mappingAdapter.GetColumns().Where(c => !c.IsIdentity));

            queryBuilder.Append(" )");

            return(queryBuilder);
        }
        protected void AppendPredicate(SqlQueryBuilder queryBuilder, Expression <Func <TEntity, bool> > predicate)
        {
            if (predicate == null)
            {
                return;
            }

            queryBuilder.Append(" WHERE ");

            _statementGeneration.AppendPart(queryBuilder, predicate);
        }
        protected void AppendUpdateStatements(SqlQueryBuilder queryBuilder, IEnumerable <MemberAssignment> assignments)
        {
            queryBuilder.Append(" SET ");

            bool first = true;

            foreach (MemberAssignment assignment in assignments)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    queryBuilder.Append(", ");
                }

                Expression asssignExpression = ExpressionHelper.MakeAssign(assignment);

                _statementGeneration.AppendPart(queryBuilder, asssignExpression);
            }
        }
        public void AppendSourceAndTargetOperator(SqlQueryBuilder queryBuilder, MemberExpression member, ExpressionType @operator)
        {
            // Source
            AppendAliasMember(queryBuilder, SOURCE_TABLE_ALIAS, member);

            // Operator
            queryBuilder.Append(" ")
            .Append(SqlOperatorTranslator.GetOpertor(@operator))
            .Append(" ");

            // Destination
            AppendAliasMember(queryBuilder, TARGET_TABLE_ALIAS, member);
        }
        public void AppendInsertMergeStatement(SqlQueryBuilder queryBuilder)
        {
            List <ColumnMapping <TEntity> > columns = _mappingAdapter.GetColumns()
                                                      .Where(c => !c.IsIdentity)
                                                      .ToList();

            queryBuilder.Append(" WHEN NOT MATCHED THEN INSERT (")
            .Append(
                string.Join(", ", columns.Select(c => c.DbColumnName))
                )
            .Append(") VALUES (")
            .Append(
                string.Join(", ", columns.Select(c => SOURCE_TABLE_ALIAS + ".[" + c.DbColumnName + "]"))
                )
            .Append(")");
        }
        public void AppendMergeJoinKeys(SqlQueryBuilder queryBuilder, IEnumerable <MemberExpression> expressions)
        {
            bool first = true;

            foreach (MemberExpression expression in expressions)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    queryBuilder.Append(" AND ");
                }

                AppendSourceAndTargetOperator(queryBuilder, expression, ExpressionType.Equal);
            }
        }