/// <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 async Task WriteToStreamAsync(NpgsqlBinaryImporter writer, TEntity entity, CancellationToken cancellationToken)
        {
            await writer.StartRowAsync(cancellationToken);

            foreach (var columnDefinition in _columns)
            {
                await columnDefinition.WriteAsync(writer, entity, cancellationToken);
            }
        }
        private async Task WriteToStream(NpgsqlBinaryImporter writer, IEnumerable <TEntity> entities)
        {
            foreach (var entity in entities)
            {
                await writer.StartRowAsync();

                foreach (var columnDefinition in _columns)
                {
                    await columnDefinition.Write(writer, entity);
                }
            }
        }
示例#4
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();
        }