/// <summary> /// /// </summary> /// <typeparam name="TPrimaryKey"></typeparam> /// <param name="connection"></param> /// <param name="tableName"></param> /// <param name="primaryKeys"></param> /// <param name="bulkCopyTimeout"></param> /// <param name="batchSize"></param> /// <param name="pseudoTableType"></param> /// <param name="transaction"></param> /// <returns></returns> private static int BinaryBulkDeleteByKeyBase <TPrimaryKey>(this NpgsqlConnection connection, string tableName, IEnumerable <TPrimaryKey> primaryKeys, int?bulkCopyTimeout = null, int?batchSize = null, BulkImportPseudoTableType pseudoTableType = default, NpgsqlTransaction transaction = null) { var identityBehavior = BulkImportIdentityBehavior.Unspecified; var dbSetting = connection.GetDbSetting(); var dbFields = DbFieldCache.Get(connection, tableName, transaction); var primaryKey = dbFields.FirstOrDefault(dbField => dbField.IsPrimary); var pseudoTableName = tableName; IEnumerable <NpgsqlBulkInsertMapItem> mappings = null; return(PseudoBasedBinaryImport(connection, tableName, bulkCopyTimeout, dbFields, // getPseudoTableName () => pseudoTableName = GetBinaryBulkDeleteByKeyPseudoTableName(tableName ?? ClassMappedNameCache.Get <TPrimaryKey>(), dbSetting), // getMappings () => mappings = new[] { new NpgsqlBulkInsertMapItem(primaryKey.Name, primaryKey.Name) }, // binaryImport (tableName) => connection.BinaryImport(tableName, GetExpandoObjectData(primaryKeys, primaryKey.AsField()), mappings, dbFields, bulkCopyTimeout, batchSize, identityBehavior, dbSetting, transaction), // getDeleteToPseudoCommandText () => GetDeleteByKeyCommandText(pseudoTableName, tableName, dbFields.FirstOrDefault(dbField => dbField.IsPrimary)?.AsField(), dbSetting), // setIdentities null, null, false, identityBehavior, pseudoTableType, dbSetting, transaction)); }
/// <summary> /// /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="connection"></param> /// <param name="tableName"></param> /// <param name="entities"></param> /// <param name="qualifiers"></param> /// <param name="mappings"></param> /// <param name="bulkCopyTimeout"></param> /// <param name="batchSize"></param> /// <param name="keepIdentity"></param> /// <param name="pseudoTableType"></param> /// <param name="transaction"></param> /// <returns></returns> private static int BinaryBulkDeleteBase <TEntity>(this NpgsqlConnection connection, string tableName, IEnumerable <TEntity> entities, IEnumerable <Field> qualifiers = null, IEnumerable <NpgsqlBulkInsertMapItem> mappings = null, int?bulkCopyTimeout = null, int?batchSize = null, bool keepIdentity = true, BulkImportPseudoTableType pseudoTableType = default, NpgsqlTransaction transaction = null) where TEntity : class { var entityType = entities?.First()?.GetType() ?? typeof(TEntity); // Solving the anonymous types var isDictionary = entityType.IsDictionaryStringObject(); var dbSetting = connection.GetDbSetting(); var dbFields = DbFieldCache.Get(connection, tableName, transaction); var pseudoTableName = tableName; var identityBehavior = keepIdentity ? BulkImportIdentityBehavior.KeepIdentity : BulkImportIdentityBehavior.Unspecified; return(PseudoBasedBinaryImport(connection, tableName, bulkCopyTimeout, dbFields, // getPseudoTableName () => pseudoTableName = GetBinaryBulkDeletePseudoTableName(tableName ?? ClassMappedNameCache.Get <TEntity>(), dbSetting), // getMappings () => { var includeIdentity = identityBehavior == BulkImportIdentityBehavior.KeepIdentity; var includePrimary = true; return mappings = mappings?.Any() == true ? mappings : isDictionary ? GetMappings(entities?.First() as IDictionary <string, object>, dbFields, includePrimary, includeIdentity, dbSetting) : GetMappings(dbFields, PropertyCache.Get(entityType), includePrimary, includeIdentity, dbSetting); }, // binaryImport (tableName) => connection.BinaryImport <TEntity>(tableName, entities, mappings, dbFields, bulkCopyTimeout, batchSize, identityBehavior, dbSetting, transaction), // getDeleteToPseudoCommandText () => GetDeleteCommandText(pseudoTableName, tableName, mappings.Select(mapping => new Field(mapping.DestinationColumn)), qualifiers, dbFields.FirstOrDefault(dbField => dbField.IsPrimary)?.AsField(), dbFields.FirstOrDefault(dbField => dbField.IsIdentity)?.AsField(), identityBehavior, dbSetting), // setIdentities (identityResults) => SetIdentities(entityType, entities, dbFields, identityResults, dbSetting), qualifiers, false, identityBehavior, pseudoTableType, dbSetting, transaction)); }
/// <summary> /// /// </summary> /// <param name="connection"></param> /// <param name="tableName"></param> /// <param name="reader"></param> /// <param name="qualifiers"></param> /// <param name="mappings"></param> /// <param name="bulkCopyTimeout"></param> /// <param name="keepIdentity"></param> /// <param name="pseudoTableType"></param> /// <param name="transaction"></param> /// <returns></returns> private static int BinaryBulkDeleteBase(this NpgsqlConnection connection, string tableName, DbDataReader reader, IEnumerable <Field> qualifiers = null, IEnumerable <NpgsqlBulkInsertMapItem> mappings = null, int?bulkCopyTimeout = null, bool keepIdentity = true, BulkImportPseudoTableType pseudoTableType = default, NpgsqlTransaction transaction = null) { var dbSetting = connection.GetDbSetting(); var dbFields = DbFieldCache.Get(connection, tableName, transaction); var pseudoTableName = tableName; var identityBehavior = keepIdentity ? BulkImportIdentityBehavior.KeepIdentity : BulkImportIdentityBehavior.Unspecified; return(PseudoBasedBinaryImport(connection, tableName, bulkCopyTimeout, dbFields, // getPseudoTableName () => pseudoTableName = GetBinaryBulkDeletePseudoTableName(tableName, dbSetting), // getMappings () => { var includeIdentity = identityBehavior == BulkImportIdentityBehavior.KeepIdentity; var includePrimary = true; return mappings = mappings?.Any() == true ? mappings : GetMappings(reader, dbFields, includePrimary, includeIdentity, dbSetting); }, // binaryImport (tableName) => connection.BinaryImport(tableName, reader, mappings, dbFields, bulkCopyTimeout, identityBehavior, dbSetting, transaction), // getDeleteToPseudoCommandText () => GetDeleteCommandText(pseudoTableName, tableName, mappings.Select(mapping => new Field(mapping.DestinationColumn)), qualifiers, dbFields.FirstOrDefault(dbField => dbField.IsPrimary)?.AsField(), dbFields.FirstOrDefault(dbField => dbField.IsIdentity)?.AsField(), identityBehavior, dbSetting), // setIdentities null, qualifiers, false, identityBehavior, pseudoTableType, dbSetting, transaction: transaction)); }
/// <summary> /// /// </summary> /// <param name="connection"></param> /// <param name="tableName"></param> /// <param name="table"></param> /// <param name="rowState"></param> /// <param name="mappings"></param> /// <param name="bulkCopyTimeout"></param> /// <param name="batchSize"></param> /// <param name="identityBehavior"></param> /// <param name="pseudoTableType"></param> /// <param name="transaction"></param> /// <returns></returns> private static int BinaryBulkInsertBase(this NpgsqlConnection connection, string tableName, DataTable table, DataRowState?rowState = null, IEnumerable <NpgsqlBulkInsertMapItem> mappings = null, int?bulkCopyTimeout = null, int?batchSize = null, BulkImportIdentityBehavior identityBehavior = default, BulkImportPseudoTableType pseudoTableType = default, NpgsqlTransaction transaction = null) { var dbSetting = connection.GetDbSetting(); var dbFields = DbFieldCache.Get(connection, tableName, transaction); var pseudoTableName = tableName; return(PseudoBasedBinaryImport(connection, tableName, bulkCopyTimeout, dbFields, // getPseudoTableName () => pseudoTableName = GetBinaryBulkInsertPseudoTableName(tableName, dbSetting), // getMappings () => { var includeIdentity = identityBehavior == BulkImportIdentityBehavior.KeepIdentity; var isPrimaryAnIdentity = IsPrimaryAnIdentity(dbFields); var includePrimary = isPrimaryAnIdentity == false || (isPrimaryAnIdentity && includeIdentity); return mappings = mappings?.Any() == true ? mappings : GetMappings(table, dbFields, includePrimary, includeIdentity, dbSetting); }, // binaryImport (tableName) => connection.BinaryImport(tableName, table, rowState, mappings, dbFields, bulkCopyTimeout, batchSize, identityBehavior, dbSetting, transaction), // getMergeToPseudoCommandText () => GetInsertCommandText(pseudoTableName, tableName, mappings.Select(mapping => new Field(mapping.DestinationColumn)), dbFields.FirstOrDefault(dbField => dbField.IsIdentity)?.AsField(), identityBehavior, dbSetting), // setIdentities (identityResults) => SetDataTableIdentities(table, dbFields, identityResults, dbSetting), null, true, identityBehavior: identityBehavior, pseudoTableType: pseudoTableType, dbSetting, transaction: transaction)); }