在没有 for 循环的情况下从 List 创建 DataTable 的最快方法
Fastest way to create DataTable from List without for loop
我们有一个 巨大的 列表(比如 100,000)需要将其转换为 DataTable
for SqlBulkcopy
.
您能否指导在不使用 for 循环的情况下执行此操作的最快方法?
现在我们这样做 - 在下面的代码中 listDos
是对象列表
using (var dataTable = new DataTable(dataTableName))
{
dataTable.Locale = CultureInfo.CurrentCulture;
var columns = new[]
{
new DataColumn("Id", typeof(int)),
new DataColumn("FkId", typeof(int)),
new DataColumn("Status", typeof(string)),
new DataColumn("RecordFrom", typeof(DateTime))
};
dataTable.Columns.AddRange(columns);
foreach (ObjectDo listDo in listDos)
{
var row = dataTable.NewRow();
if (rebuildDo.Id != null) row["Id"] = rebuildDo.Id;
if (rebuildDo.FkId!= null) row["FkId"] = rebuildDo.FkId;
row["Status"] = rebuildDo.Status;
row["RecordFrom"] = rebuildDo.RecordFrom;
dataTable.Rows.Add(row);
}
return dataTable;
}
最快的方法是:不要。
SqlBulkCopy
可以取一个 IDataReader
。 "FastMember"(在 NuGet 上)可以将 List<T>
公开为 IDataReader
:
List<ObjectDo> listDos = ...
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(listDos,
"Id", "FkId", "Status", "RecordFrom"))
{
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}
现在这是直接 reader 列表:所有内容都没有重复。
我们有一个 巨大的 列表(比如 100,000)需要将其转换为 DataTable
for SqlBulkcopy
.
您能否指导在不使用 for 循环的情况下执行此操作的最快方法?
现在我们这样做 - 在下面的代码中 listDos
是对象列表
using (var dataTable = new DataTable(dataTableName))
{
dataTable.Locale = CultureInfo.CurrentCulture;
var columns = new[]
{
new DataColumn("Id", typeof(int)),
new DataColumn("FkId", typeof(int)),
new DataColumn("Status", typeof(string)),
new DataColumn("RecordFrom", typeof(DateTime))
};
dataTable.Columns.AddRange(columns);
foreach (ObjectDo listDo in listDos)
{
var row = dataTable.NewRow();
if (rebuildDo.Id != null) row["Id"] = rebuildDo.Id;
if (rebuildDo.FkId!= null) row["FkId"] = rebuildDo.FkId;
row["Status"] = rebuildDo.Status;
row["RecordFrom"] = rebuildDo.RecordFrom;
dataTable.Rows.Add(row);
}
return dataTable;
}
最快的方法是:不要。
SqlBulkCopy
可以取一个 IDataReader
。 "FastMember"(在 NuGet 上)可以将 List<T>
公开为 IDataReader
:
List<ObjectDo> listDos = ...
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(listDos,
"Id", "FkId", "Status", "RecordFrom"))
{
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}
现在这是直接 reader 列表:所有内容都没有重复。