/// <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); }
/// <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); }
/// <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); }
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(); } }