No dudes en divulgar nuestra web y códigos en tus redes sociales, ayúdanos a ampliar esta comunidad.
Solución:
Con FastMember, puede hacer esto sin necesidad de pasar por DataTable
(que, en mis pruebas, más del doble del rendimiento):
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description"))
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
Tenga en cuenta que ObjectReader
también puede trabajar con fuentes no genéricas, y no es necesario especificar los nombres de los miembros de antemano (aunque probablemente desee usar el ColumnMappings
aspecto de SqlBulkCopy
si no los especifica en el ObjectReader
sí mismo).
Simplemente cree un DataTable de su lista de objetos y llame SqlBulkCopy.WriteToServer
pasando la tabla de datos.
Puede encontrar lo siguiente útil:
- Agregar columnas a un DataTable. Agregue una columna para cada propiedad/campo que desee escribir.
- Agregar filas a un DataTable. Agregue una fila para cada objeto en su lista.
Para obtener el máximo rendimiento con SqlBulkCopy, debe establecer un BatchSize adecuado. 10,000 parece funcionar bien, pero perfile sus datos.
También puede observar mejores resultados al usar SqlBulkCopyOptions.TableLock.
Puede encontrar un análisis interesante e informativo del rendimiento de SqlBulkCopy aquí.
Tarde a la fiesta, pero si le sumas esto EntityDataReader
clase de Microsoft, hay una AsDataReader()
método de extensión que hace exactamente eso: https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs
(ejemplo [List].AsDataReader()
implementación:)
var connStr = "";
using (var connection = new SqlConnection(connStr))
var startTime = DateTime.Now;
connection.Open();
var transaction = connection.BeginTransaction();
try
//var connStr = connection.ConnectionString;
using (var sbCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
sbCopy.BulkCopyTimeout = 0;
sbCopy.BatchSize = 10000;
sbCopy.DestinationTableName = "Foobars";
var reader = Foobars.AsDataReader();
sbCopy.WriteToServer(reader);
transaction.Commit();
catch (Exception ex)
Console.WriteLine(ex.Message);
transaction.Rollback();
finally
transaction.Dispose();
connection.Close();
var endTime = DateTime.Now;
Console.WriteLine("Upload time elapsed: 0 seconds", (endTime - startTime).TotalSeconds);
Comentarios y valoraciones
Si te sientes suscitado, tienes la habilidad dejar una reseña acerca de qué le añadirías a esta división.