public string GenerateGetAllQuery() { var info = EntityInformationCache.GetEntityInformation <TEntity>(); var columnsList = GenerateColumnsList(_table, info.Columns); return($"SELECT {columnsList} FROM {_table};"); }
public string GenerateInsertQuery(TEntity entity) { var info = EntityInformationCache.GetEntityInformation <TEntity>(); var identityColumns = info.PrimaryKeys.Where(pk => pk.IsIdentity).ToList(); var identityProperties = identityColumns.Select(pk => pk.Property).ToList(); var columnsToInsert = info.Columns .Where(column => !identityProperties.Contains(column.Property) && (!column.HasDefaultConstraint || !column.HasDefaultValue(entity))) .ToList(); string selectStatement = ""; if (identityColumns.Any()) { var column = identityColumns.SingleOrDefault(); if (column == null) { throw new InvalidOperationException("Cannot generate INSERT query for table with multiple identity columns"); } var columnsList = GenerateColumnsList(_table, info.Columns); selectStatement = $"SELECT {columnsList} FROM {_table} WHERE {_table}.{column.ColumnName} = LAST_INSERT_ID();"; } else { selectStatement = GenerateGetQuery(); } return($@"INSERT INTO {_table} ({string.Join(", ", columnsToInsert.Select(column => column.ColumnName))}) VALUES ({string.Join(", ", columnsToInsert.Select(column => $"@{column.Name}"))}); {selectStatement}"); }
public string GenerateGetQuery() { var info = EntityInformationCache.GetEntityInformation <TEntity>(); var whereClause = info.PrimaryKeys.Count == 0 ? GenerateWhereClauseWithoutPrimaryKey(info) : GenerateWhereClauseWithPrimaryKeys(info); var columnsList = GenerateColumnsList(_table, info.Columns); return($"SELECT {columnsList} FROM {_table} WHERE {whereClause};"); }
public string GenerateDeleteQuery() { var info = EntityInformationCache.GetEntityInformation <TEntity>(); var whereClause = info.PrimaryKeys.Count == 0 ? GenerateWhereClauseWithoutPrimaryKey(info) : GenerateWhereClauseWithPrimaryKeys(info); var outputColumns = GenerateColumnsList("deleted", info.Columns); return($"DELETE FROM {_schemaAndTable} OUTPUT {outputColumns} WHERE {whereClause};"); }
public string GenerateInsertQuery(TEntity entity) { var info = EntityInformationCache.GetEntityInformation <TEntity>(); var identityColumns = info.PrimaryKeys.Where(pk => pk.IsIdentity).Select(pk => pk.Property).ToList(); var columnsToInsert = info.Columns .Where(column => !identityColumns.Contains(column.Property) && (!column.HasDefaultConstraint || !column.HasDefaultValue(entity))) .ToList(); var outputColumns = GenerateColumnsList("inserted", info.Columns); return($"INSERT INTO {_schemaAndTable} ({string.Join(", ", columnsToInsert.Select(column => AddSquareBrackets(column.ColumnName)))}) OUTPUT {outputColumns} VALUES ({string.Join(", ", columnsToInsert.Select(column => $"@{column.Name}"))});"); }
private async Task <TEntity?> GetInternalAsync(TEntity entity, Func <string, TEntity, Task <IEnumerable <TEntity> > > execute) { if (entity == null) { throw new ArgumentNullException(nameof(entity)); } var info = EntityInformationCache.GetEntityInformation <TEntity>(); var query = _queryGenerator.GenerateGetQuery(); var result = await execute(query, entity); return(result?.FirstOrDefault()); }
private async Task <TEntity?> GetInternal(TPrimaryKeyEntity entity, Func <TPrimaryKeyEntity, string, Task <TEntity?> > execute) { if (entity == null) { throw new ArgumentNullException(nameof(entity)); } var info = EntityInformationCache.GetEntityInformation <TEntity>(); CheckForDefaultPrimaryKeys(info, entity); var query = _queryGenerator.GenerateGetQuery(); var result = await execute(entity, query); return(result); }
public string GenerateUpdateQuery() { var info = EntityInformationCache.GetEntityInformation <TEntity>(); if (!info.PrimaryKeys.Any()) { throw new InvalidOperationException($"GenerateUpdateQuery for entity of type {typeof(TEntity).FullName} failed as the type has no properties marked with [PrimaryKeyColumn]."); } var setClause = GenerateSetClause(info); if (string.IsNullOrEmpty(setClause)) { throw new InvalidOperationException($"GenerateUpdateQuery for entity of type {typeof(TEntity).FullName} failed as the type has no columns with a setter."); } var outputColumns = GenerateColumnsList("inserted", info.Columns); return($"UPDATE {_schemaAndTable} SET {setClause} OUTPUT {outputColumns} WHERE {GenerateWhereClauseWithPrimaryKeys(info)};"); }
private async Task <TEntity> InsertInternalAsync(TEntity entity, Func <string, TEntity, Task <TEntity> > execute) { if (entity == null) { throw new ArgumentNullException(nameof(entity)); } var info = EntityInformationCache.GetEntityInformation <TEntity>(); var invalidIdentityColumns = info.PrimaryKeys .Where(pk => pk.IsIdentity && !pk.HasDefaultValue(entity)) .ToList(); if (invalidIdentityColumns.Any()) { throw new ArgumentException($"entity has the following primary keys marked with IsIdentity, which have non-default values: {string.Join(", ", invalidIdentityColumns.Select(col => col.Name))}", nameof(entity)); } var query = _queryGenerator.GenerateInsertQuery(entity); return(await execute(query, entity)); }