/// <inheritdoc /> public virtual SqlQuery GetUpdate(TEntity entity) { var properties = SqlProperties.Where(p => !KeySqlProperties.Any(k => k.PropertyName.Equals(p.PropertyName, StringComparison.OrdinalIgnoreCase)) && !p.IgnoreUpdate).ToArray(); if (!properties.Any()) { throw new ArgumentException("Can't update without [Key]"); } if (HasUpdatedAt) { UpdatedAtProperty.SetValue(entity, DateTime.UtcNow); } var query = new SqlQuery(entity); query.SqlBuilder.Append(string.Format("UPDATE {0} SET {1} WHERE {2}", TableName, string.Join(", ", properties.Select(p => string.Format("{0} = @{1}", p.ColumnName, p.PropertyName))), string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate) .Select(p => string.Format("{0} = @{1}", p.ColumnName, p.PropertyName))) )); return(query); }
/// <inheritdoc /> public virtual SqlQuery GetInsert(TEntity entity) { var properties = (IsIdentity ? SqlProperties.Where(p => !p.PropertyName.Equals(IdentitySqlProperty.PropertyName, StringComparison.OrdinalIgnoreCase)) : SqlProperties).ToList(); var keyProperty = KeySqlProperties.Where(s => s.PropertyInfo.PropertyType == typeof(Guid) || s.PropertyInfo.PropertyType == typeof(Guid?)).FirstOrDefault(); #region If There Is No Identity Property if (!IsIdentity && keyProperty != null) { var oldKey = keyProperty.PropertyInfo.GetValue(entity, null); if (oldKey == null || (Guid?)oldKey == default(Guid?)) { keyProperty.PropertyInfo.SetValue(entity, Guid.NewGuid()); } } #endregion if (HasCreatedAt) { CreatedAtProperty.SetValue(entity, DateTime.UtcNow); } if (HasUpdatedAt) { UpdatedAtProperty.SetValue(entity, DateTime.UtcNow); } var query = new SqlQuery(TableName, entity, QueryType.Insert); query.SqlBuilder.AppendFormat("INSERT INTO {0} ({1}) VALUES ({2})", TableName, string.Join(", ", properties.Select(p => p.ColumnName)), string.Join(", ", properties.Select(p => "@" + p.PropertyName))); // values if (IsIdentity) { switch (Config.SqlProvider) { case SqlProvider.MSSQL: query.SqlBuilder.Append(" SELECT SCOPE_IDENTITY() AS " + IdentitySqlProperty.ColumnName); break; case SqlProvider.MySQL: query.SqlBuilder.Append("; SELECT CONVERT(LAST_INSERT_ID(), SIGNED INTEGER) AS " + IdentitySqlProperty.ColumnName); break; case SqlProvider.PostgreSQL: query.SqlBuilder.Append(" RETURNING " + IdentitySqlProperty.ColumnName); break; default: throw new ArgumentOutOfRangeException(); } } return(query); }
/// <inheritdoc /> public virtual SqlQuery GetUpdate(TEntity entity) { 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 (HasUpdatedAt) { UpdatedAtProperty.SetValue(entity, DateTime.UtcNow); } var query = new SqlQuery(entity); query.SqlBuilder.Append("UPDATE " + TableName + " SET " + string.Join(", ", properties.Select(p => p.ColumnName + " = @" + p.PropertyName)) + " WHERE " + string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate && !p.RowVersionProp) .Select(p => 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: throw new ArgumentOutOfRangeException(); default: throw new ArgumentOutOfRangeException(); } LogSqlQuery(query); return(query); }
/// <inheritdoc /> public virtual SqlQuery GetBulkUpdate(IEnumerable <TEntity> entities) { 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).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))) )); // 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)); } // ReSharper restore PossibleNullReferenceException } query.SetParam(parameters); return(query); }
/// <inheritdoc /> public virtual SqlQuery GetUpdate(TEntity entity) { var properties = SqlProperties.Where(p => !KeySqlProperties.Any(k => k.PropertyName.Equals(p.PropertyName, StringComparison.OrdinalIgnoreCase)) && !p.IgnoreUpdate); if (HasUpdatedAt) { UpdatedAtProperty.SetValue(entity, DateTime.UtcNow); } var query = new SqlQuery(entity); query.SqlBuilder.Append("UPDATE " + TableName + " SET " + string.Join(", ", properties.Select(p => p.ColumnName + " = @" + p.PropertyName)) + " WHERE " + string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate).Select(p => p.ColumnName + " = @" + p.PropertyName))); return(query); }
/// <inheritdoc /> public virtual SqlQuery GetBulkUpdate(IEnumerable <TEntity> entities) { 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).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); } query.SqlBuilder.Append(" UPDATE " + TableName + " SET " + string.Join(", ", properties.Select(p => p.ColumnName + " = @" + p.PropertyName + i)) + " WHERE " + string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate).Select(p => p.ColumnName + " = @" + p.PropertyName + i))); 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)); } } query.SetParam(parameters); return(query); }
/// <inheritdoc /> public virtual SqlQuery GetUpdate(TEntity entity) { var properties = SqlProperties.Where(p => !KeySqlProperties.Any(k => k.PropertyName.Equals(p.PropertyName, StringComparison.OrdinalIgnoreCase)) && !p.IgnoreUpdate).ToArray(); if (!properties.Any()) { throw new ArgumentException("Can't update without [Key]"); } if (HasUpdatedAt) { var attribute = UpdatedAtProperty.GetCustomAttribute <UpdatedAtAttribute>(); var offset = attribute.TimeKind == DateTimeKind.Local ? new DateTimeOffset(DateTime.Now) : new DateTimeOffset(DateTime.UtcNow); if (attribute.OffSet != 0) { offset = offset.ToOffset(TimeSpan.FromHours(attribute.OffSet)); } UpdatedAtProperty.SetValue(entity, offset.DateTime); } var query = new SqlQuery(entity); query.SqlBuilder .Append("UPDATE ") .Append(TableName) .Append(" SET "); query.SqlBuilder.Append(string.Join(", ", properties .Select(p => $"{p.ColumnName} = @{p.PropertyName}"))); query.SqlBuilder.Append(" WHERE "); query.SqlBuilder.Append(string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate) .Select(p => $"{p.ColumnName} = @{p.PropertyName}"))); return(query); }
/// <inheritdoc /> public virtual SqlQuery GetUpdate(TEntity entity, params Expression <Func <TEntity, object> >[] includes) { var properties = SqlProperties.Where(p => !KeySqlProperties.Any(k => k.PropertyName.Equals(p.PropertyName, StringComparison.OrdinalIgnoreCase)) && !p.IgnoreUpdate).ToArray(); if (!properties.Any()) { throw new ArgumentException("Can't update without [Key]"); } if (HasUpdatedAt) { var attribute = UpdatedAtProperty.GetCustomAttribute <UpdatedAtAttribute>(); var offset = attribute.TimeKind == DateTimeKind.Local ? new DateTimeOffset(DateTime.Now) : new DateTimeOffset(DateTime.UtcNow); if (attribute.OffSet != 0) { offset = offset.ToOffset(TimeSpan.FromHours(attribute.OffSet)); } UpdatedAtProperty.SetValue(entity, offset.DateTime); } var query = new SqlQuery(); query.SqlBuilder .Append("UPDATE ") .Append(TableName) .Append(" "); if (includes?.Length > 0) { var joinsBuilder = AppendJoinToUpdate(entity, query, includes); query.SqlBuilder.Append("SET "); query.SqlBuilder.Append(GetFieldsUpdate(TableName, properties, UseQuotationMarks == true)); query.SqlBuilder.Append(joinsBuilder); } else { query.SqlBuilder.Append("SET "); query.SqlBuilder.Append(GetFieldsUpdate(TableName, properties, UseQuotationMarks == true)); } query.SqlBuilder.Append(" WHERE "); query.SqlBuilder.Append(string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate) .Select(p => $"{TableName}.{p.ColumnName} = @{entity.GetType().Name}{p.PropertyName}"))); if (query.Param == null || !(query.Param is Dictionary <string, object> parameters)) { parameters = new Dictionary <string, object>(); } foreach (var metadata in properties.Concat(KeySqlProperties)) { parameters.Add($"{entity.GetType().Name}{metadata.PropertyName}", entity.GetType().GetProperty(metadata.PropertyName).GetValue(entity, null)); } query.SetParam(parameters); 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); }
/// <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 GetBulkUpdate(IEnumerable <TEntity> entities) { 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).ToArray(); var query = new SqlQuery(); var parameters = new Dictionary <string, object>(); for (var i = 0; i < entitiesArray.Length; i++) { var entity = entitiesArray[i]; if (HasUpdatedAt) { var attribute = UpdatedAtProperty.GetCustomAttribute <UpdatedAtAttribute>(); var offset = attribute.TimeKind == DateTimeKind.Local ? new DateTimeOffset(DateTime.Now) : new DateTimeOffset(DateTime.UtcNow); if (attribute.OffSet != 0) { offset = offset.ToOffset(TimeSpan.FromHours(attribute.OffSet)); } UpdatedAtProperty.SetValue(entity, offset.DateTime); } if (i > 0) { query.SqlBuilder.Append("; "); } query.SqlBuilder.Append( $"UPDATE {TableName} SET {string.Join(", ", properties.Select(p => $"{p.ColumnName} = @{p.PropertyName}{i}"))} WHERE {string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate).Select(p => $"{p.ColumnName} = @{p.PropertyName}{i}"))}"); // ReSharper disable PossibleNullReferenceException foreach (var property in properties) { parameters.Add(property.PropertyName + i, entityType.GetProperty(property.PropertyName).GetValue(entity, null)); } foreach (var property in KeySqlProperties.Where(p => !p.IgnoreUpdate)) { parameters.Add(property.PropertyName + i, entityType.GetProperty(property.PropertyName).GetValue(entity, null)); } // ReSharper restore PossibleNullReferenceException } query.SetParam(parameters); return(query); }
/// <inheritdoc /> public virtual SqlQuery GetBulkInsert(IEnumerable <TEntity> entities) { var entitiesArray = entities as TEntity[] ?? entities.ToArray(); if (!entitiesArray.Any()) { throw new ArgumentException("collection is empty"); } var entityType = entitiesArray[0].GetType(); var properties = (IsIdentity ? SqlProperties.Where(p => !p.PropertyName.Equals(IdentitySqlProperty.PropertyName, StringComparison.OrdinalIgnoreCase)) : SqlProperties).ToList(); var query = new SqlQuery(TableName, QueryType.Insert); var values = new List <string>(); var parameters = new Dictionary <string, object>(); var keyProperty = KeySqlProperties.Where(s => s.PropertyInfo.PropertyType == typeof(Guid) || s.PropertyInfo.PropertyType == typeof(Guid?)).FirstOrDefault(); for (var i = 0; i < entitiesArray.Length; i++) { #region If There Is No Identity Property if (!IsIdentity && keyProperty != null) { var oldKey = keyProperty.PropertyInfo.GetValue(entitiesArray[i], null); if (oldKey == null || (Guid?)oldKey == default(Guid?)) { keyProperty.PropertyInfo.SetValue(entitiesArray[i], Guid.NewGuid()); } } #endregion if (HasCreatedAt) { CreatedAtProperty.SetValue(entitiesArray[i], DateTime.UtcNow); } if (HasUpdatedAt) { UpdatedAtProperty.SetValue(entitiesArray[i], DateTime.UtcNow); } foreach (var property in properties) { // ReSharper disable once PossibleNullReferenceException parameters.Add(property.PropertyName + i, entityType.GetProperty(property.PropertyName).GetValue(entitiesArray[i], null)); } values.Add(string.Format("({0})", string.Join(", ", properties.Select(p => "@" + p.PropertyName + i)))); } query.SqlBuilder.AppendFormat("INSERT INTO {0} ({1}) VALUES {2}", TableName, string.Join(", ", properties.Select(p => p.ColumnName)), string.Join(",", values)); // values query.SetParam(parameters); query.SetTable(TableName); return(query); }
/// <inheritdoc /> public virtual SqlQuery GetBulkUpdate(IEnumerable <TEntity> entities) { 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).ToArray(); var query = new SqlQuery(); var parameters = new Dictionary <string, object?>(); //In Oracle we use MERGE INTO to excute multipe update with argument. List <string> singleSelectsForOracle = new List <string>(); for (var i = 0; i < entitiesArray.Length; i++) { var entity = entitiesArray[i]; if (HasUpdatedAt && UpdatedAtProperty.GetCustomAttribute <UpdatedAtAttribute>() is { } attribute) { var offset = attribute.TimeKind == DateTimeKind.Local ? new DateTimeOffset(DateTime.Now) : new DateTimeOffset(DateTime.UtcNow); if (attribute.OffSet != 0) { offset = offset.ToOffset(TimeSpan.FromHours(attribute.OffSet)); } UpdatedAtProperty.SetValue(entity, offset.DateTime); } if (Provider != SqlProvider.Oracle) { if (i > 0) { query.SqlBuilder.Append("; "); } query.SqlBuilder.Append( $"UPDATE {TableName} SET {string.Join(", ", properties.Select(p => $"{p.ColumnName} = {ParameterSymbol}{p.PropertyName}{i}"))} WHERE {string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate).Select(p => $"{p.ColumnName} = {ParameterSymbol}{p.PropertyName}{i}"))}"); } else { var singleSelect = $"SELECT {string.Join(", ", properties.Select(p => $"{ParameterSymbol}{p.PropertyName}{i} AS {p.ColumnName}"))}, {string.Join(" , ", KeySqlProperties.Where(p => !p.IgnoreUpdate).Select(p => $"{ParameterSymbol}{p.PropertyName}{i} AS {p.ColumnName}"))} FROM DUAL"; singleSelectsForOracle.Add(singleSelect); } // ReSharper disable PossibleNullReferenceException foreach (var property in properties) { parameters.Add(property.PropertyName + i, entityType.GetProperty(property.PropertyName)?.GetValue(entity, null)); } foreach (var property in KeySqlProperties.Where(p => !p.IgnoreUpdate)) { parameters.Add(property.PropertyName + i, entityType.GetProperty(property.PropertyName)?.GetValue(entity, null)); } // ReSharper restore PossibleNullReferenceException } query.SetParam(parameters); if (Provider == SqlProvider.Oracle) { var unionTName = $"{TableName}_BULKUPDATE"; var unionSelect = string.Join(" UNION ALL ", singleSelectsForOracle); var unionOn = $"({string.Join(" AND ", KeySqlProperties.Where(p => !p.IgnoreUpdate).Select(p => $"{unionTName}.{p.ColumnName} = {TableName}.{p.ColumnName}"))})"; var unionSet = $"{string.Join(",", properties.Select(p => $"{p.ColumnName} = {unionTName}.{p.ColumnName} "))}"; query.SqlBuilder.Append($"MERGE INTO {TableName} {TableName} USING ({unionSelect}) {unionTName} ON {unionOn} WHEN MATCHED THEN UPDATE SET {unionSet}"); } return(query); }