/// <inheritdoc /> public virtual SqlQuery GetInsert(TEntity entity) { var properties = (IsIdentity ? SqlProperties.Where(p => (!p.PropertyName.Equals(IdentitySqlProperty.PropertyName, StringComparison.OrdinalIgnoreCase) || (MandatoryInsertProperty != null && MandatoryInsertProperty.Any(x => x.Name == p.PropertyName))) && !p.IgnoreCreate && !p.RowVersionProp) : SqlProperties).ToList(); if (HasCreatedAt) { CreatedAtProperty.SetValue(entity, DateTime.UtcNow); } if (HasUpdatedAt) { UpdatedAtProperty.SetValue(entity, DateTime.UtcNow); } var query = new SqlQuery(entity); 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); query.SqlBuilder.Append(" SELECT * FROM " + TableName + " WHERE " + IdentitySqlProperty.ColumnName + " = SCOPE_IDENTITY()"); break; case SqlProvider.MySQL: //query.SqlBuilder.Append("; SELECT CONVERT(LAST_INSERT_ID(), SIGNED INTEGER) AS " + IdentitySqlProperty.ColumnName); query.SqlBuilder.Append("; SELECT * FROM " + TableName + " WHERE " + IdentitySqlProperty.ColumnName + " = CONVERT(LAST_INSERT_ID(), SIGNED INTEGER)"); break; case SqlProvider.PostgreSQL: query.SqlBuilder.Append("; SELECT * FROM " + TableName + " WHERE " + IdentitySqlProperty.ColumnName + " = CURRVAL('" + TableName + "_" + IdentitySqlProperty.ColumnName + "_seq')"); //query.SqlBuilder.Append(" RETURNING " + IdentitySqlProperty.ColumnName); break; default: throw new ArgumentOutOfRangeException(); } } LogSqlQuery(query); 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) || (MandatoryInsertProperty != null && MandatoryInsertProperty.Any(x => x.Name == p.PropertyName))) && !p.IgnoreCreate && !p.RowVersionProp) : SqlProperties).ToList(); var query = new SqlQuery(); var values = new List <string>(); var parameters = new Dictionary <string, object>(); for (var i = 0; i < entitiesArray.Length; i++) { 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); 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(); } }