public IReadOnlyDictionary <string, ITableReferenceIdentifier> GetTableReferenceIdentifierByTableMultiPartIdentifier(IContextScope contextScope, IReadOnlyList <ITable> selectionTables, params ITableRelationship[] tableRelationships) { // TODO: The reason why you're unioning these here is because you definitely need all of the table relationships found, plus, you need the original tables you selected. Find a better way to do this. var fromTables = tableRelationships.Select(tableRelationship => tableRelationship.FromTable); var toTables = tableRelationships.Select(tableRelationship => tableRelationship.ToTable); var tables = selectionTables.Union(fromTables).Union(toTables); var tableReferenceSpecifications = new List <ITableReferenceSpecification>(); foreach (var table in tables) { var serverName = _sqlFormatter.QuoteEncapsulate(table.ServerName); var databaseName = _sqlFormatter.QuoteEncapsulate(table.DatabaseName); var schemaName = _sqlFormatter.QuoteEncapsulate(table.SchemaName); var tableName = _sqlFormatter.QuoteEncapsulate(table.TableName); var whitespaceDelimitation = _pascalCaseRegex.Replace(tableName, "$1 $2"); var titleCasing = _textInfo.ToTitleCase(whitespaceDelimitation); var tableAlias = _predicateRegex.Replace(titleCasing, string.Empty); tableReferenceSpecifications.AddRange(new List <ITableReferenceSpecification> { new TableReferenceSpecification(table, TableReferenceSpecificationScope.AliasAbbreviationIdentifier, TableReferenceSpecificationKind.TableAlias, tableAlias), new TableReferenceSpecification(table, TableReferenceSpecificationScope.AliasTableIdentifier, TableReferenceSpecificationKind.TableAlias, tableName), new TableReferenceSpecification(table, TableReferenceSpecificationScope.AliasSchemaIdentifier, TableReferenceSpecificationKind.TableAlias, $"{schemaName}_{tableName}"), new TableReferenceSpecification(table, TableReferenceSpecificationScope.AliasDatabaseIdentifier, TableReferenceSpecificationKind.TableAlias, $"{databaseName}_{schemaName}_{tableName}"), new TableReferenceSpecification(table, TableReferenceSpecificationScope.AliasServerIdentifier, TableReferenceSpecificationKind.TableAlias, $"{serverName.ToUpper()}_{databaseName}_{schemaName}_{tableName}"), new TableReferenceSpecification(table, TableReferenceSpecificationScope.TableSourceTableIdentifier, TableReferenceSpecificationKind.TableSource, table.SchemaName.ToLower() != "dbo" ? $"{table.SchemaName}.{table.TableName}" : tableName), new TableReferenceSpecification(table, TableReferenceSpecificationScope.TableSourceSchemaIdentifier, TableReferenceSpecificationKind.TableSource, $"{schemaName}.{tableName}"), new TableReferenceSpecification(table, TableReferenceSpecificationScope.TableSourceDatabaseIdentifier, TableReferenceSpecificationKind.TableSource, $"{databaseName}.{schemaName}.{tableName}"), new TableReferenceSpecification(table, TableReferenceSpecificationScope.TableSourceServerIdentifier, TableReferenceSpecificationKind.TableSource, $"{serverName.ToUpper()}.{databaseName}.{schemaName}.{tableName}") }); } RemoveTableReferenceSpecificationCollisions(contextScope, ref tableReferenceSpecifications); var tableReferenceIdentifierByTableMultiPartIdentifier = tableReferenceSpecifications.GroupBy(tableReferenceSpecification => tableReferenceSpecification.Table.MultiPartIdentifier) .ToDictionary(tableMultiPartIdentifier => tableMultiPartIdentifier.Key, grouping => { var orderedEnumerable = grouping.OrderBy(tableReferenceSpecification => tableReferenceSpecification.TableReferenceSpecificationScope); var tableAlias = orderedEnumerable.First(tableReferenceSpecification => tableReferenceSpecification.TableReferenceSpecificationKind == TableReferenceSpecificationKind.TableAlias); var tableSource = orderedEnumerable.First(tableReferenceSpecification => tableReferenceSpecification.TableReferenceSpecificationKind == TableReferenceSpecificationKind.TableSource); return(new TableReferenceIdentifier ( tableAlias: tableAlias.TableAlias, tableSource: tableSource.TableAlias ) as ITableReferenceIdentifier); }); return(tableReferenceIdentifierByTableMultiPartIdentifier); }