Esempio n. 1
0
        /// <inheritdoc />
        public virtual SqlQuery GetUpdate(Expression <Func <TEntity, bool> > predicate, TEntity entity, Expression <Func <TEntity, object> > propertiesToUpdate)
        {
            var properties = SqlProperties.Where(p =>
                                                 !KeySqlProperties.Any(k => k.PropertyName.Equals(p.PropertyName, StringComparison.OrdinalIgnoreCase)) && !p.IgnoreUpdate && !p.RowVersionProp).ToArray();

            if (propertiesToUpdate != null)
            {
                string[] updateProperties = ExpressionHelper.GetMemberName(propertiesToUpdate);
                if (HasMandatoryProp)
                {
                    properties = properties.Where(x =>
                                                  updateProperties.Contains(x.PropertyName) ||
                                                  MandatoryUpdateProperty.Select(y => y.Name).Contains(x.PropertyName))
                                 .ToArray();
                }
                else
                {
                    properties = properties.Where(x =>
                                                  updateProperties.Contains(x.PropertyName))
                                 .ToArray();
                }
            }

            if (HasUpdatedAt)
            {
                UpdatedAtProperty.SetValue(entity, DateTime.UtcNow);
            }

            var query = new SqlQuery(entity);

            query.SqlBuilder
            .Append("UPDATE ")
            .Append(TableName)
            .Append(" SET ");

            query.SqlBuilder.Append(string.Join(", ", properties
                                                .Select(p => string.Format("{0} = @{1}", p.ColumnName, p.PropertyName))));

            query.SqlBuilder
            .Append(" ");

            AppendWherePredicateQuery(query, predicate, QueryType.Update);

            if (HasRowVersion)
            {
                query.SqlBuilder.Append(" AND " + RowVersionPropertyMetadata.ColumnName + " = @" + RowVersionPropertyMetadata.PropertyName);
            }

            switch (Config.SqlProvider)
            {
            case SqlProvider.MSSQL:
                query.SqlBuilder.Append("; SELECT * FROM " + TableName + " ");
                AppendWherePredicateQuery(query, predicate, QueryType.Update);
                if (HasRowVersion)
                {
                    query.SqlBuilder.Append(" AND " + RowVersionPropertyMetadata.ColumnName + " = @" + RowVersionPropertyMetadata.PropertyName);
                }
                break;

            case SqlProvider.MySQL:
                query.SqlBuilder.Append("; SELECT * FROM " + TableName + " ");
                AppendWherePredicateQuery(query, predicate, QueryType.Update);
                if (HasRowVersion)
                {
                    query.SqlBuilder.Append(" AND " + RowVersionPropertyMetadata.ColumnName + " = @" + RowVersionPropertyMetadata.PropertyName);
                }
                break;

            case SqlProvider.PostgreSQL:
                query.SqlBuilder.Append("; SELECT * FROM " + TableName + " ");
                AppendWherePredicateQuery(query, predicate, QueryType.Update);
                if (HasRowVersion)
                {
                    query.SqlBuilder.Append(" AND " + RowVersionPropertyMetadata.ColumnName + " = @" + RowVersionPropertyMetadata.PropertyName);
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            var parameters = new Dictionary <string, object>();
            var entityType = entity.GetType();

            foreach (var property in properties)
            {
                parameters.Add(property.PropertyName, entityType.GetProperty(property.PropertyName).GetValue(entity, null));
            }

            if (query.Param is Dictionary <string, object> whereParam)
            {
                parameters.AddRange(whereParam);
            }

            query.SetParam(parameters);

            LogSqlQuery(query);
            return(query);
        }
Esempio n. 2
0
        /// <inheritdoc />
        public virtual SqlQuery GetBulkUpdate(IEnumerable <TEntity> entities, Expression <Func <TEntity, object> > propertiesToUpdate)
        {
            var entitiesArray = entities as TEntity[] ?? entities.ToArray();

            if (!entitiesArray.Any())
            {
                throw new ArgumentException("collection is empty");
            }

            var entityType = entitiesArray[0].GetType();

            var properties = SqlProperties.Where(p =>
                                                 !KeySqlProperties.Any(k => k.PropertyName.Equals(p.PropertyName, StringComparison.OrdinalIgnoreCase)) && !p.IgnoreUpdate && !p.RowVersionProp).ToArray();

            if (propertiesToUpdate != null)
            {
                string[] updateProperties = ExpressionHelper.GetMemberName(propertiesToUpdate);
                if (HasMandatoryProp)
                {
                    properties = properties.Where(x =>
                                                  updateProperties.Contains(x.PropertyName) ||
                                                  MandatoryUpdateProperty.Select(y => y.Name).Contains(x.PropertyName))
                                 .ToArray();
                }
                else
                {
                    properties = properties.Where(x =>
                                                  updateProperties.Contains(x.PropertyName))
                                 .ToArray();
                }
            }

            var query = new SqlQuery();

            var parameters = new Dictionary <string, object>();

            for (var i = 0; i < entitiesArray.Length; i++)
            {
                if (HasUpdatedAt)
                {
                    UpdatedAtProperty.SetValue(entitiesArray[i], DateTime.UtcNow);
                }

                if (i > 0)
                {
                    query.SqlBuilder.Append("; ");
                }

                query.SqlBuilder.Append(string.Format("UPDATE {0} SET {1} WHERE {2}", TableName,
                                                      string.Join(", ", properties.Select(p => string.Format("{0} = @{1}{2}", p.ColumnName, p.PropertyName, i))),
                                                      string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate)
                                                                  .Select(p => string.Format("{0} = @{1}{2}", p.ColumnName, p.PropertyName, i)))
                                                      ));

                if (HasRowVersion)
                {
                    query.SqlBuilder.Append(" AND " + RowVersionPropertyMetadata.ColumnName + " = @" + RowVersionPropertyMetadata.PropertyName);
                }

                // ReSharper disable PossibleNullReferenceException
                foreach (var property in properties)
                {
                    parameters.Add(property.PropertyName + i, entityType.GetProperty(property.PropertyName).GetValue(entitiesArray[i], null));
                }

                //foreach (var property in KeySqlProperties.Where(p => !p.IgnoreUpdate))
                //    parameters.Add(property.PropertyName + i, entityType.GetProperty(property.PropertyName).GetValue(entitiesArray[i], null));

                foreach (var property in KeySqlProperties.Where(p => !p.IgnoreUpdate && !p.RowVersionProp))
                {
                    parameters.Add(property.PropertyName + i, entityType.GetProperty(property.PropertyName).GetValue(entitiesArray[i], null));
                }

                foreach (var property in KeySqlProperties.Where(p => p.RowVersionProp))
                {
                    parameters.Add(property.PropertyName + i, entityType.GetProperty(property.PropertyName).GetValue(entitiesArray[i], null));
                }

                // ReSharper restore PossibleNullReferenceException
            }

            query.SetParam(parameters);

            LogSqlQuery(query);
            return(query);
        }
Esempio n. 3
0
        /// <inheritdoc />
        public virtual SqlQuery GetUpdate(TEntity entity, Expression <Func <TEntity, object> > propertiesToUpdate)
        {
            var properties = SqlProperties.Where(p =>
                                                 !KeySqlProperties.Any(k => k.PropertyName.Equals(p.PropertyName, StringComparison.OrdinalIgnoreCase)) &&
                                                 !p.IgnoreUpdate && !p.RowVersionProp).ToArray();

            if (!properties.Any())
            {
                throw new ArgumentException("Can't update without [Key]");
            }

            if (propertiesToUpdate != null)
            {
                string[] updateProperties = ExpressionHelper.GetMemberName(propertiesToUpdate);
                if (HasMandatoryProp)
                {
                    properties = properties.Where(x =>
                                                  updateProperties.Contains(x.PropertyName) ||
                                                  MandatoryUpdateProperty.Select(y => y.Name).Contains(x.PropertyName))
                                 .ToArray();
                }
                else
                {
                    properties = properties.Where(x =>
                                                  updateProperties.Contains(x.PropertyName))
                                 .ToArray();
                }
            }

            if (HasUpdatedAt)
            {
                UpdatedAtProperty.SetValue(entity, DateTime.UtcNow);
            }

            var query = new SqlQuery(entity);

            query.SqlBuilder
            .Append("UPDATE ")
            .Append(TableName)
            .Append(" SET ");

            query.SqlBuilder.Append(string.Join(", ", properties
                                                .Select(p => string.Format("{0} = @{1}", p.ColumnName, p.PropertyName))));

            query.SqlBuilder.Append(" WHERE ");

            query.SqlBuilder.Append(string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate && !p.RowVersionProp)
                                                .Select(p => string.Format("{0} = @{1}", p.ColumnName, p.PropertyName))));

            if (HasRowVersion)
            {
                query.SqlBuilder.Append(" AND " + RowVersionPropertyMetadata.ColumnName + " = @" + RowVersionPropertyMetadata.PropertyName);
            }

            switch (Config.SqlProvider)
            {
            case SqlProvider.MSSQL:
                //query.SqlBuilder.Append(" SELECT SCOPE_IDENTITY() AS " + IdentitySqlProperty.ColumnName);
                query.SqlBuilder.Append("; SELECT * FROM " + TableName + " WHERE " + string.Join(" AND ",
                                                                                                 KeySqlProperties.Where(p => !p.IgnoreUpdate && !p.RowVersionProp)
                                                                                                 .Select(p => p.ColumnName + " = @" + p.PropertyName)));
                break;

            case SqlProvider.MySQL:
                //query.SqlBuilder.Append("; SELECT CONVERT(LAST_INSERT_ID(), SIGNED INTEGER) AS " + IdentitySqlProperty.ColumnName);
                query.SqlBuilder.Append("; SELECT * FROM " + TableName + " WHERE " + string.Join(" AND ",
                                                                                                 KeySqlProperties.Where(p => !p.IgnoreUpdate && !p.RowVersionProp)
                                                                                                 .Select(p => p.ColumnName + " = @" + p.PropertyName)));
                break;

            case SqlProvider.PostgreSQL:
                query.SqlBuilder.Append("; SELECT * FROM " + TableName + " WHERE " + string.Join(" AND ",
                                                                                                 KeySqlProperties.Where(p => !p.IgnoreUpdate && !p.RowVersionProp)
                                                                                                 .Select(p => p.ColumnName + " = @" + p.PropertyName)));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            LogSqlQuery(query);
            return(query);
        }
Esempio n. 4
0
        private void InitProperties()
        {
            var entityType     = typeof(TEntity);
            var entityTypeInfo = entityType.GetTypeInfo();
            var tableAttribute = entityTypeInfo.GetCustomAttribute <TableAttribute>();

            TableName   = tableAttribute != null ? tableAttribute.Name : entityTypeInfo.Name;
            TableSchema = tableAttribute != null ? tableAttribute.Schema : string.Empty;

            AllProperties = entityType.FindClassProperties().Where(q => q.CanWrite).ToArray();

            var props = AllProperties.Where(ExpressionHelper.GetPrimitivePropertiesPredicate()).ToArray();

            var joinProperties = AllProperties.Where(p => p.GetCustomAttributes <JoinAttributeBase>().Any()).ToArray();

            SqlJoinProperties = GetJoinPropertyMetadata(joinProperties);

            // Filter the non stored properties
            SqlProperties = props.Where(p => !p.GetCustomAttributes <NotMappedAttribute>().Any()).Select(p => new SqlPropertyMetadata(p)).ToArray();

            // Filter key properties
            KeySqlProperties = props.Where(p => p.GetCustomAttributes <KeyAttribute>().Any()).Select(p => new SqlPropertyMetadata(p)).ToArray();

            // Use identity as key pattern
            var identityProperty = props.FirstOrDefault(p => p.GetCustomAttributes <IdentityAttribute>().Any());

            IdentitySqlProperty = identityProperty != null ? new SqlPropertyMetadata(identityProperty) : null;

            var dateCreatedProperty = props.FirstOrDefault(p => p.GetCustomAttributes <CreatedAtAttribute>().Count() == 1);

            if (dateCreatedProperty != null && (dateCreatedProperty.PropertyType == typeof(DateTime) ||
                                                dateCreatedProperty.PropertyType == typeof(DateTime?)) &&
                !dateCreatedProperty.GetCustomAttributes <NotMappedAttribute>().Any())
            {
                CreatedAtProperty         = props.FirstOrDefault(p => p.GetCustomAttributes <CreatedAtAttribute>().Any());
                CreatedAtPropertyMetadata = new SqlPropertyMetadata(CreatedAtProperty);
            }

            var dateChangedProperty = props.FirstOrDefault(p => p.GetCustomAttributes <UpdatedAtAttribute>().Count() == 1);

            if (dateChangedProperty != null && (dateChangedProperty.PropertyType == typeof(DateTime) || dateChangedProperty.PropertyType == typeof(DateTime?)))
            {
                UpdatedAtProperty         = props.FirstOrDefault(p => p.GetCustomAttributes <UpdatedAtAttribute>().Any());
                UpdatedAtPropertyMetadata = new SqlPropertyMetadata(UpdatedAtProperty);
            }

            var rowVersionProperty = props.FirstOrDefault(p => p.GetCustomAttributes <RowVersionAttribute>().Count() == 1);

            if (rowVersionProperty != null && (rowVersionProperty.PropertyType == typeof(byte[]) ||
                                               rowVersionProperty.PropertyType == typeof(byte)) &&
                !rowVersionProperty.GetCustomAttributes <NotMappedAttribute>().Any())
            {
                RowVersionProperty         = props.FirstOrDefault(p => p.GetCustomAttributes <RowVersionAttribute>().Any());
                RowVersionPropertyMetadata = new SqlPropertyMetadata(RowVersionProperty);
            }

            var manUpdateProperty = props.Where(p => p.GetCustomAttributes <MandatoryUpdateAttribute>().Any());

            if (manUpdateProperty.Any())
            {
                MandatoryUpdateProperty   = props.Where(p => p.GetCustomAttributes <MandatoryUpdateAttribute>().Any() && !p.GetCustomAttributes <NotMappedAttribute>().Any()).ToArray();
                ManUpdatePropertyMetadata = MandatoryUpdateProperty.Select(x => new SqlPropertyMetadata(x)).ToArray();
            }

            var manInsertProperty = props.Where(p => p.GetCustomAttributes <MandatoryInsertAttribute>().Any());

            if (manInsertProperty.Any())
            {
                MandatoryInsertProperty   = props.Where(p => p.GetCustomAttributes <MandatoryInsertAttribute>().Any() && !p.GetCustomAttributes <NotMappedAttribute>().Any()).ToArray();
                ManInsertPropertyMetadata = MandatoryInsertProperty.Select(x => new SqlPropertyMetadata(x)).ToArray();
            }
        }