/// <summary> /// /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="importer"></param> /// <param name="moveNextAsync"></param> /// <param name="getCurrentAsync"></param> /// <param name="writeAsync"></param> /// <param name="identityBehavior"></param> /// <param name="cancellationToken"></param> /// <returns></returns> private static async Task <int> BinaryImportWriteAsync <TEntity>(NpgsqlBinaryImporter importer, Func <Task <bool> > moveNextAsync, Func <Task <TEntity> > getCurrentAsync, Func <TEntity, Task> writeAsync, BulkImportIdentityBehavior identityBehavior, CancellationToken cancellationToken = default) where TEntity : class { var result = 0; while (await moveNextAsync()) { await importer.StartRowAsync(cancellationToken); await EnsureCustomizedOrderColumnAsync(importer, identityBehavior, result, cancellationToken); await writeAsync(await getCurrentAsync()); result++; } await importer.CompleteAsync(cancellationToken); return(result); }
private static async ValueTask <ulong> CompleteAndWriteRelationValues <TEntity>(NpgsqlConnection connection, NpgsqlBinaryImporter binaryImporter, EntityDefinition <TEntity> entityDefinition, IEnumerable <TEntity> entities, CancellationToken cancellationToken) where TEntity : class { ulong insertCount = await binaryImporter.CompleteAsync(cancellationToken); await binaryImporter.DisposeAsync(); for (int columnIndex = 0; columnIndex < entityDefinition.ForeignColumnDefinitions.Count; columnIndex++) { var column = entityDefinition.ForeignColumnDefinitions[columnIndex]; insertCount += await column.WriteValues(entities, connection, cancellationToken); } return(insertCount); }
public static async Task PerformBulkCopyAsync(this DbDataReader dr, NpgsqlBinaryImporter writer, DataColumnCollection columns = null) { columns ??= dr.GetSchemaTable().Columns; while (await dr.ReadAsync()) { await writer.StartRowAsync(); foreach (DataColumn col in columns) { switch (dr[col.Ordinal]) { case bool x: await writer.WriteAsync(x); break; case byte x: await writer.WriteAsync(x); break; case sbyte x: await writer.WriteAsync(x); break; case short x: await writer.WriteAsync(x); break; case ushort x: await writer.WriteAsync(x); break; case int x: await writer.WriteAsync(x); break; case uint x: await writer.WriteAsync(x); break; case long x: await writer.WriteAsync(x); break; case ulong x: await writer.WriteAsync(x); break; case Guid x: await writer.WriteAsync(x); break; case DateTime x: await writer.WriteAsync(x); break; case TimeSpan x: await writer.WriteAsync(x); break; case string x: await writer.WriteAsync(x); break; case null: writer.WriteNull(); break; } } } await writer.CompleteAsync(); }