Avec FastMember, vous pouvez le faire sans jamais avoir besoin de passer par DataTable (ce qui, dans mes tests, fait plus que doubler les performances) :
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description"))
{
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}
Notez que ObjectReader peut également fonctionner avec des sources non génériques, et il n'est pas nécessaire de spécifier les noms de membres à l'avance (bien que vous souhaitiez probablement utiliser les ColumnMappings aspect de SqlBulkCopy si vous ne les spécifiez pas dans le ObjectReader lui-même).