/// <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> /// <param name="cancellationToken"></param> /// <returns></returns> private static async Task <int> BinaryBulkDeleteBaseAsync(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, CancellationToken cancellationToken = default) { var dbSetting = connection.GetDbSetting(); var dbFields = await DbFieldCache.GetAsync(connection, tableName, transaction, cancellationToken); var pseudoTableName = tableName; var identityBehavior = keepIdentity ? BulkImportIdentityBehavior.KeepIdentity : BulkImportIdentityBehavior.Unspecified; return(await PseudoBasedBinaryImportAsync(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 async (tableName) => await connection.BinaryImportAsync(tableName, reader, mappings, dbFields, bulkCopyTimeout, identityBehavior, dbSetting, transaction, cancellationToken), // 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 : identityBehavior, pseudoTableType : pseudoTableType, dbSetting, transaction : transaction, cancellationToken)); }
/// <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> /// <param name="cancellationToken"></param> /// <returns></returns> private static async Task <int> BinaryBulkInsertBaseAsync(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, CancellationToken cancellationToken = default) { var dbSetting = connection.GetDbSetting(); var dbFields = await DbFieldCache.GetAsync(connection, tableName, transaction, cancellationToken); var pseudoTableName = tableName; return(await PseudoBasedBinaryImportAsync(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 async (tableName) => await connection.BinaryImportAsync(tableName, table, rowState, mappings, dbFields, bulkCopyTimeout, batchSize, identityBehavior, dbSetting, transaction, cancellationToken), // 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, cancellationToken)); }
/// <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> /// <param name="cancellationToken"></param> /// <returns></returns> private static async Task <int> BinaryBulkDeleteBaseAsync <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, CancellationToken cancellationToken = default) where TEntity : class { var entityType = entities?.First()?.GetType() ?? typeof(TEntity); // Solving the anonymous types var isDictionary = entityType.IsDictionaryStringObject(); var dbSetting = connection.GetDbSetting(); var dbFields = await DbFieldCache.GetAsync(connection, tableName, transaction, cancellationToken); var pseudoTableName = tableName; var identityBehavior = keepIdentity ? BulkImportIdentityBehavior.KeepIdentity : BulkImportIdentityBehavior.Unspecified; return(await PseudoBasedBinaryImportAsync(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 async (tableName) => await connection.BinaryImportAsync <TEntity>(tableName, entities, mappings, dbFields, bulkCopyTimeout, batchSize, identityBehavior, dbSetting, transaction, cancellationToken), // 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, cancellationToken)); }
/// <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> /// <param name="cancellationToken"></param> /// <returns></returns> private static async Task <int> BinaryBulkDeleteByKeyBaseAsync <TPrimaryKey>(this NpgsqlConnection connection, string tableName, IEnumerable <TPrimaryKey> primaryKeys, int?bulkCopyTimeout = null, int?batchSize = null, BulkImportPseudoTableType pseudoTableType = default, NpgsqlTransaction transaction = null, CancellationToken cancellationToken = default) { var identityBehavior = BulkImportIdentityBehavior.Unspecified; var dbSetting = connection.GetDbSetting(); var dbFields = await DbFieldCache.GetAsync(connection, tableName, transaction, cancellationToken); var primaryKey = dbFields.FirstOrDefault(dbField => dbField.IsPrimary); var pseudoTableName = tableName; IEnumerable <NpgsqlBulkInsertMapItem> mappings = null; return(await PseudoBasedBinaryImportAsync(connection, tableName, bulkCopyTimeout, dbFields, // getPseudoTableName () => pseudoTableName = GetBinaryBulkDeleteByKeyPseudoTableName(tableName ?? ClassMappedNameCache.Get <TPrimaryKey>(), dbSetting), // getMappings () => mappings = new[] { new NpgsqlBulkInsertMapItem(primaryKey.Name, primaryKey.Name) }, // binaryImport async (tableName) => await connection.BinaryImportAsync(tableName, GetExpandoObjectData(primaryKeys, primaryKey.AsField()), mappings, dbFields, bulkCopyTimeout, batchSize, identityBehavior, dbSetting, transaction, cancellationToken), // getDeleteToPseudoCommandText () => GetDeleteByKeyCommandText(pseudoTableName, tableName, dbFields.FirstOrDefault(dbField => dbField.IsPrimary)?.AsField(), dbSetting), // setIdentities null, null, false, identityBehavior, pseudoTableType, dbSetting, transaction, cancellationToken)); }