private void AppendJoinSource(StringBuilder joinClause, DbmsForeignKey foreignKey) { string fkTableAlias = foreignKey.ForeignKeyBaseTable.LinkProperty.Alias; string pkTableAlias = foreignKey.PrimaryUniqueKeyBaseTable.LinkProperty.Alias; List <DbmsColumn> fkColumns = foreignKey.ForeignKeyColumns; List <DbmsColumn> pkColumns = foreignKey.PrimaryUniqueKeyColumns; int nCols = foreignKey.ForeignKeyColumns.Count; bool parentheses = foreignKey.PrimaryUniqueKeyBaseTable.ForeignKeys.Count > 0; if (foreignKey.IsNullable) { joinClause.Append("LEFT JOIN"); } else { joinClause.Append("INNER JOIN"); } if (parentheses) { joinClause.AppendLine(" ("); } else { joinClause.AppendLine(); } joinClause.Append(BuildJoinClause(foreignKey.PrimaryUniqueKeyBaseTable).PushIndent()); if (parentheses) { joinClause.Append(") "); } joinClause.Append("ON ("); for (int i = 0; i < nCols; i++) { if (i > 0) { joinClause.Append(" AND "); } joinClause.AppendFormat("{0}.{1} = {2}.{3}", fkTableAlias, fkColumns[i].ColumnName, pkTableAlias, pkColumns[i].ColumnName); } joinClause.AppendLine(")"); }
public void AddForeignKeyColumn(string constraintName, string foreignKeyColumn, bool foreignKeyNullable, string referencedTable, string referencedColumn, bool referencedNullable, bool detectCycle = true) { DbmsForeignKey fk = _ForeignKeys.LastOrDefault(s => constraintName.Equals(s.ConstraintName, StringComparison.OrdinalIgnoreCase)); if (fk == null) { if (detectCycle && _ParentForeignKey != null) { if (_ParentForeignKey.DetectCycle(constraintName)) { return; } } fk = new DbmsForeignKey(constraintName, this, referencedTable); _ForeignKeys.Add(fk); } fk.AddForeignKeyColumn(new DbmsColumn(foreignKeyColumn, foreignKeyNullable), new DbmsColumn(referencedColumn, referencedNullable)); }
public bool DetectCycle(string constraintName) // Call before the constraintName to be added into the tree { if (string.IsNullOrWhiteSpace(constraintName)) { return(DetectLoopback()); } DbmsRelationTree baseTable; for (DbmsForeignKey foreignKey = this; foreignKey != null; foreignKey = baseTable.ParentForeignKey) { if (constraintName.Equals(foreignKey.ConstraintName, System.StringComparison.OrdinalIgnoreCase)) { return(true); } else { baseTable = foreignKey.ForeignKeyBaseTable; } } return(false); }
public DbmsRelationTree(string tableName, DbmsForeignKey parentForeignKey = null) { _NodeTableName = _QualifiedName = tableName; _ParentForeignKey = parentForeignKey; _ForeignKeys = new List <DbmsForeignKey>(); }