private void BuildSelectSQL(IPropertiesMapping mapper, StringBuilder sb, DbManager db) { foreach (IMapper mapField in mapper.PropertiesMapping) { if (mapField is ValueMapper) { sb.AppendFormat("\t{0}.{1},\n", ((IObjectMapper)mapper).PropertyType.Name, db.DataProvider.Convert(((ValueMapper)mapField).ColumnName, ConvertType.NameToQueryField)); } else if (mapField is IPropertiesMapping) { var propertiesMapping = (IPropertiesMapping)mapField; var cel = propertiesMapping.ParentMapping; while (cel != null) { // To avoid recursion dont take in account types already loaded. if (((IMapper)cel).PropertyType == mapField.PropertyType) { continue; } cel = cel.ParentMapping; } var objectMapper = (IObjectMapper)mapField; if (!objectMapper.IsLazy) { BuildSelectSQL(propertiesMapping, sb, db); } } else { throw new NotImplementedException(mapField.GetType() + " is not yet implemented."); } } }
protected void AppendJoinTableName(IPropertiesMapping mapper, StringBuilder sb, DbManager db, Type type, string tableName = "T") { string parentName = FullGetTableName(type); Dictionary<string, ValueMapper> valueMappers = mapper.PropertiesMapping.Where(e => e is ValueMapper).Cast<ValueMapper>().ToDictionary(e => e.PropertyName, e => e); int tableNr = 0; foreach (IMapper mapField in mapper.PropertiesMapping) { var objectMapper = mapField as IObjectMapper; if (objectMapper != null) { if (!_ignoreLazyLoad) { if (objectMapper.IsLazy) continue; } string thisKey = objectMapper.Association.ThisKey[0]; // TITLE string parentDbField = valueMappers.ContainsKey(thisKey) ? valueMappers[thisKey].ColumnName : thisKey; // ARTIST string childDbField = objectMapper.PropertiesMapping.Where(e => e is ValueMapper).Cast<ValueMapper>().First( e => e.PropertyName == objectMapper.Association.OtherKey[0]).ColumnName; string childDatabase = GetDatabaseName(mapField.PropertyType); string childOwner = base.GetOwnerName(mapField.PropertyType); string childName = base.GetTableName(mapField.PropertyType); string childAlias = FullGetTableName(mapField.PropertyType); StringBuilder childFullName = db.DataProvider.CreateSqlProvider().BuildTableName( new StringBuilder(), childDatabase == null ? null : db.DataProvider.Convert(childDatabase, ConvertType.NameToDatabase).ToString(), childOwner == null ? null : db.DataProvider.Convert(childOwner, ConvertType.NameToOwner).ToString(), childName == null ? null : db.DataProvider.Convert(childName, ConvertType.NameToQueryTable).ToString()); sb.AppendFormat("\tFULL OUTER JOIN {0} {1} ON {2}.{3}={4}.{5}\n", childFullName, tableName + tableNr.ToString() /*childAlias*/, tableName /*parentName*/, parentDbField, tableName + tableNr.ToString() /*childAlias*/, childDbField ); AppendJoinTableName((IPropertiesMapping)mapField, sb, db, mapField.PropertyType, tableName + tableNr.ToString()); tableNr++; } } sb.AppendLine(); //SELECT // ARTIST2.ID_ARTIST, // ARTIST2.ARTIST, // TRACK.ID_TRACK, // TRACK.TRACK, // TRACK.ID_ARTIST, // ARTIST.ID_ARTIST, // ARTIST.ARTIST //FROM // PITAFR01.ARTIST ARTIST2 // INNER JOIN PITAFR01.TRACK TRACK ON ARTIST2.ID_ARTIST=TRACK.ID_ARTIST // INNER JOIN PITAFR01.ARTIST ARTIST ON TRACK.ID_ARTIST=ARTIST.ID_ARTIST //WHERE // ARTIST2.ID_ARTIST = 2566 }
private void AppendJoinTableName(IPropertiesMapping mapper, StringBuilder sb, DbManager db, Type type, string tableName = "T") { string parentName = FullGetTableName(type); Dictionary <string, ValueMapper> valueMappers = mapper.PropertiesMapping.Where(e => e is ValueMapper).Cast <ValueMapper>().ToDictionary(e => e.PropertyName, e => e); int tableNr = 0; foreach (IMapper mapField in mapper.PropertiesMapping) { var objectMapper = mapField as IObjectMapper; if (objectMapper != null) { if (!_ignoreLazyLoad) { if (objectMapper.IsLazy) { continue; } } string thisKey = objectMapper.Association.ThisKey[0]; // TITLE string parentDbField = valueMappers.ContainsKey(thisKey) ? valueMappers[thisKey].ColumnName : thisKey; // ARTIST string childDbField = objectMapper.PropertiesMapping.Where(e => e is ValueMapper).Cast <ValueMapper>().First( e => e.PropertyName == objectMapper.Association.OtherKey[0]).ColumnName; string childDatabase = GetDatabaseName(mapField.PropertyType); string childOwner = base.GetOwnerName(mapField.PropertyType); string childName = base.GetTableName(mapField.PropertyType); string childAlias = FullGetTableName(mapField.PropertyType); StringBuilder childFullName = db.DataProvider.CreateSqlProvider().BuildTableName( new StringBuilder(), childDatabase == null ? null : db.DataProvider.Convert(childDatabase, ConvertType.NameToDatabase).ToString(), childOwner == null ? null : db.DataProvider.Convert(childOwner, ConvertType.NameToOwner).ToString(), childName == null ? null : db.DataProvider.Convert(childName, ConvertType.NameToQueryTable).ToString()); sb.AppendFormat("\tFULL OUTER JOIN {0} {1} ON {2}.{3}={4}.{5}\n", childFullName, tableName + tableNr.ToString() /*childAlias*/, tableName /*parentName*/, parentDbField, tableName + tableNr.ToString() /*childAlias*/, childDbField ); AppendJoinTableName((IPropertiesMapping)mapField, sb, db, mapField.PropertyType, tableName + tableNr.ToString()); tableNr++; } } sb.AppendLine(); //SELECT // ARTIST2.ID_ARTIST, // ARTIST2.ARTIST, // TRACK.ID_TRACK, // TRACK.TRACK, // TRACK.ID_ARTIST, // ARTIST.ID_ARTIST, // ARTIST.ARTIST //FROM // PITAFR01.ARTIST ARTIST2 // INNER JOIN PITAFR01.TRACK TRACK ON ARTIST2.ID_ARTIST=TRACK.ID_ARTIST // INNER JOIN PITAFR01.ARTIST ARTIST ON TRACK.ID_ARTIST=ARTIST.ID_ARTIST //WHERE // ARTIST2.ID_ARTIST = 2566 }
private void BuildSelectSQL(IPropertiesMapping mapper, StringBuilder sb, DbManager db) { foreach (IMapper mapField in mapper.PropertiesMapping) { if (mapField is ValueMapper) sb.AppendFormat("\t{0}.{1},\n", ((IObjectMapper)mapper).PropertyType.Name, db.DataProvider.Convert(((ValueMapper)mapField).ColumnName, ConvertType.NameToQueryField)); else if (mapField is IPropertiesMapping) { var propertiesMapping = (IPropertiesMapping)mapField; var cel = propertiesMapping.ParentMapping; while (cel != null) { // To avoid recursion dont take in account types already loaded. if (((IMapper)cel).PropertyType == mapField.PropertyType) continue; cel = cel.ParentMapping; } var objectMapper = (IObjectMapper)mapField; if (!objectMapper.IsLazy) BuildSelectSQL(propertiesMapping, sb, db); } else throw new NotImplementedException(mapField.GetType() + " is not yet implemented."); } }