public async Task <IEnumerable <C> > DeleteAsync(Expression <Func <C, object> >?where = null)
        {
            RegisteredClass registeredClass = _dBAutomator.RegisteredClasses.First(r => r.SomeClass.GetType() == typeof(C));

            List <ExpressionModel <C> > expressions = new List <ExpressionModel <C> >();

            BinaryExpression?binaryExpression = GetBinaryExpression(where);

            GetExpressions(binaryExpression, expressions, registeredClass);

            string sql = $"DELETE FROM \"{registeredClass.TableName}\"";

            if (where != null)
            {
                sql = $"{sql} WHERE {where.GetWhereClause(expressions)}";
            }

            sql = $"{sql} RETURNING *;";

            _logger.LogTrace(sql);

            DynamicParameters p = GetDynamicParametersFromExpression(expressions);

            using NpgsqlConnection connection = new NpgsqlConnection(_queryOptions.ConnectionString);

            await connection.OpenAsync();

            Stopwatch stopwatch = StopWatchStart();

            var result = await connection.QueryAsync <C>(sql, p, _queryOptions.DbTransaction, _queryOptions.CommandTimeOut);

            StopWatchEnd(stopwatch, "GetAsync()");

            return(result);
        }
        public async Task <IEnumerable <C> > UpdateAsync(Expression <Func <C, object> > setCollection, Expression <Func <C, object> >?whereCollection = null)
        {
            RegisteredClass registeredClass = _dBAutomator.RegisteredClasses.First(r => r.SomeClass.GetType() == typeof(C));

            List <ExpressionModel <C> > setExpressions = new List <ExpressionModel <C> >();

            BinaryExpression?setBinaryExpression = GetBinaryExpression(setCollection);

            GetExpressions(setBinaryExpression, setExpressions, registeredClass, "s_");

            List <ExpressionModel <C> > whereExpressions = new List <ExpressionModel <C> >();

            BinaryExpression?whereBinaryExpression = GetBinaryExpression(whereCollection);

            GetExpressions(whereBinaryExpression, whereExpressions, registeredClass);

            string sql = $"UPDATE \"{registeredClass.TableName}\" SET {setCollection.GetWhereClause(setExpressions)}";

            if (whereCollection != null)
            {
                sql = $"{sql} WHERE {whereCollection.GetWhereClause(whereExpressions)}";
            }

            sql = $"{sql} RETURNING *;";

            _logger.LogTrace(sql);

            DynamicParameters p = GetDynamicParametersFromExpression(setExpressions);

            GetDynamicParametersFromExpression(whereExpressions, p);

            using NpgsqlConnection connection = new NpgsqlConnection(_queryOptions.ConnectionString);

            connection.Open();

            var stopWatch = StopWatchStart();

            var result = await connection.QueryAsync <C>(sql, p, _queryOptions.DbTransaction, _queryOptions.CommandTimeOut);

            StopWatchEnd(stopWatch, "UpdateAsync");

            connection.Close();

            return(result);
        }
Exemple #3
0
        public async Task <IEnumerable <C> > GetAsync(Expression <Func <C, object> >?where = null, OrderByClause <C>?orderBy = null)
        {
            RegisteredClass registeredClass = _dBAutomator.RegisteredClasses.First(r => r.SomeClass.GetType() == typeof(C));

            List <ExpressionModel <C> > expressions = new List <ExpressionModel <C> >();

            BinaryExpression?binaryExpression = GetBinaryExpression(where);

            GetExpressions(binaryExpression, expressions, registeredClass);

            string sql = $"SELECT";

            foreach (var property in registeredClass.RegisteredProperties)
            {
                sql = $"{sql} \"{property.ColumnName}\",";
            }

            sql = sql[0..^ 1];
Exemple #4
0
        public async Task <C> InsertAsync(C item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item), "The item cannot be null");
            }

            RegisteredClass registeredClass = _dBAutomator.RegisteredClasses.First(r => r.SomeClass.GetType() == item.GetType());

            DynamicParameters p = GetDynamicParameters(item, registeredClass.RegisteredProperties);

            string sql = $"INSERT INTO \"{registeredClass.TableName}\" (";

            foreach (var property in registeredClass.RegisteredProperties.Where(p => !p.IsAutoIncrement))
            {
                sql = $"{sql}\"{property.ColumnName}\", ";
            }

            sql = sql[0..^ 2];
        public async Task <int> DeleteAsync(C item)
        {
            if (item == null)
            {
                throw new NullReferenceException("The item cannot be null.");
            }

            RegisteredClass registeredClass = _dBAutomator.RegisteredClasses.First(r => r.SomeClass.GetType() == typeof(C));

            DynamicParameters p = GetDynamicParameters(item, registeredClass.RegisteredProperties);

            string sql = $"DELETE FROM \"{registeredClass.TableName}\" WHERE {GetWhereClause(item, registeredClass.RegisteredProperties)};";

            _logger.LogTrace(sql);

            if (item is IDBObject dBObject)
            {
                await dBObject.OnDeleteAsync(_dBAutomator);
            }

            using NpgsqlConnection connection = new NpgsqlConnection(_queryOptions.ConnectionString);

            await connection.OpenAsync();

            Stopwatch stopwatch = StopWatchStart();

            var result = await connection.ExecuteAsync(sql, p, _queryOptions.DbTransaction, _queryOptions.CommandTimeOut);

            StopWatchEnd(stopwatch, "GetAsync()");

            if (item is IDBObject dBObject1)
            {
                await dBObject1.OnDeletedAsync(_dBAutomator);
            }

            return(result);
        }
        public async Task <C> UpdateAsync(C item)
        {
            if (item == null)
            {
                throw new NullReferenceException("The item cannot be null.");
            }

            RegisteredClass registeredClass = _dBAutomator.RegisteredClasses.First(r => r.SomeClass.GetType() == typeof(C));

            DynamicParameters p = GetDynamicParameters(item, registeredClass.RegisteredProperties);

            var keys = registeredClass.RegisteredProperties.Where(p => p.IsKey);

            if (keys.Count() == 0)
            {
                throw new Exception("The registered class does not have a primary key attribute.");
            }

            string sql = $"UPDATE \"{registeredClass.TableName}\" SET {GetWhereClause(item, registeredClass.RegisteredProperties.Where(p => !p.IsAutoIncrement).ToList(), ",")} WHERE";

            foreach (var key in keys)
            {
                sql = $"{sql} \"{key.ColumnName}\" =";

                if (key.PropertyType == typeof(ulong))
                {
                    sql = $"{sql} {Convert.ToInt64(item.GetType().GetProperty(key.PropertyName).GetValue(item, null))}";
                }
                else
                {
                    sql = $"{sql} {item.GetType().GetProperty(key.PropertyName).GetValue(item, null)}";
                }

                sql = $"{sql} AND";
            }

            sql = sql[0..^ 3];
Exemple #7
0
 public ExpressionModel(RegisteredClass registeredClass, string parameterPrefix = "w_")
 {
     _registeredClass = registeredClass;
     ParameterPrefix  = parameterPrefix;
 }