/// <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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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();
        }