Npgsql - 来自 ConcurrentQueue<T> 的 BulkCopy

Npgsql - BulkCopy from ConcurrentQueue<T>

假设我有这样的方法:

public async Task BulkCopy(ConcurrentQueue<Model> modelQueue, string connectionString)
{
    while(modelQueue.IsEmpty == false)
    {
        try
        {
            using(NpgsqlConnection connection = new NpgsqlConnection(connectionString))
            {
                await connection.OpenAsync();

                using(var writer = connection.BeginBinaryImport("COPY myTable (Id,Name,Something,SomethingElse)"))
                {
                    // Is this what I'm supposed to do?
                    foreach(Model item in modelQueue)
                    {
                        writer.WriteRow(item);
                    }
                }
            }
        }
    }
}

模型具有属性 Guid Id、字符串名称、字符串 Something、字符串 SomethingElse(就像 table)。

我可以使用 WriteRow() 并传入整个对象吗?这是实施方式还是我做错了?

这个问题的答案非常简单,因为 ConcurrentQueue 实现了 IEnumerable,我所要做的就是 运行 通过队列并写入数据。

public async Task BulkCopy(ConcurrentQueue<Model> modelQueue, string connectionString)
{
    while(modelQueue.IsEmpty == false)
    {
        try
        {
            using(NpgsqlConnection connection = new NpgsqlConnection(connectionString))
            {
                await connection.OpenAsync();

                using(var writer = connection.BeginBinaryImport("COPY myTable (Id,Name,Something,SomethingElse) FROM STDIN (FORMAT BINARY)"))
                {
                    foreach(Model item in modelQueue)
                    {
                        writer.StartRow();
                        writer.Write(item.Id, NpgsqlTypes.NpgsqlDbType.Uuid);
                        writer.Write(item.Name);
                        writer.Write(item.Something);
                        writer.Write(item.SomethingElse);
                    }
                }
            }
        }
    }
}

这似乎可以解决问题。 30000条记录平均耗时540ms