void PrepareSubqueryMappingDictonary() { foreach (var association in MetaData.AssociateProperties) { var associateMetaData = DataProviderMetaDataGenerator.Generate(association.AssociateType); var alias = $"[{{0}}.{association.Name}_{associateMetaData.TableName}]"; var partialAlias = $"{{0}}.{association.Name}_"; var template = $@"SELECT {alias}.{associateMetaData.IdColumnName} FROM {associateMetaData.GetTableTemplate().FormatWith(partialAlias)} WHERE {alias}.[{associateMetaData.IdColumnName}] = [{{1}}].[{association.Name}]"; SubqueryMapping.Add( association.Name.WithSuffix(".*"), template); } foreach (var baseClass in MetaData.BaseClassesInOrder) { foreach (var pair in baseClass.GetProvider(Cache, Access, SqlCommandGenerator).SubqueryMapping) { SubqueryMapping.Add(pair.Key, pair.Value); } } }
void PrepareSubqueryMappingDictonary() { foreach (var association in MetaData.AssociateProperties) { var associateMetaData = DataProviderMetaDataGenerator.Generate(association.AssociateType); var alias = SqlCommandGenerator.SafeId($"{{0}}.{association.Name}_{associateMetaData.TableName}"); var partialAlias = $"{{0}}.{association.Name}_"; var template = $@"SELECT {alias}.{associateMetaData.IdColumnName} FROM {associateMetaData.GetTableTemplate(SqlCommandGenerator).FormatWith(partialAlias)} WHERE {alias}.{SqlCommandGenerator.SafeId(associateMetaData.IdColumnName)} = {SqlCommandGenerator.SafeId("{1}")}.{SqlCommandGenerator.SafeId(association.Name)}"; SubqueryMapping.Add( association.Name.WithSuffix(".*"), template); } foreach (var baseClass in MetaData.BaseClassesInOrder) { foreach (var pair in baseClass.GetProvider(Cache, Access, SqlCommandGenerator).SubqueryMapping) { if (SubqueryMapping.ContainsKey(pair.Key) && SubqueryMapping[pair.Key] != pair.Value) { throw new Exception("Multiple subqueries needed with the same key."); } SubqueryMapping[pair.Key] = pair.Value; } } }
internal DataProvider(Type type, ICache cache, IDataAccess access, ISqlCommandGenerator sqlCommandGenerator) { EntityType = type; SqlCommandGenerator = sqlCommandGenerator; Cache = cache; Access = access; MetaData = DataProviderMetaDataGenerator.Generate(type); DeleteCommand = SqlCommandGenerator.GenerateDeleteCommand(MetaData); UpdateCommand = SqlCommandGenerator.GenerateUpdateCommand(MetaData); InsertCommand = SqlCommandGenerator.GenerateInsertCommand(MetaData); if (UpdateCommand.IsEmpty()) { UpdateSelf = entity => Task.CompletedTask; } else { UpdateSelf = UpdateSelfImpl; } }