Example #1
0
        public string GenerateGetAllQuery()
        {
            var info        = EntityInformationCache.GetEntityInformation <TEntity>();
            var columnsList = GenerateColumnsList(_table, info.Columns);

            return($"SELECT {columnsList} FROM {_table};");
        }
Example #2
0
        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}");
        }
Example #3
0
        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};");
        }
Example #4
0
        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};");
        }
Example #5
0
        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());
        }
Example #7
0
        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);
        }
Example #8
0
        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)};");
        }
Example #9
0
        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));
        }