在没有for循环的情况下从List创建DataTable的最快方法

Oxy*_*gen 1 c# linq datacontext sqlbulkcopy linqdatasource

我们有一个巨大的列表(比如100,000),需要转换DataTableSqlBulkcopy.

你能指导什么是最快的方法,而不使用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;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 8

最快的方法是:不要.

SqlBulkCopy可以拿一个IDataReader."FastMember"(在NuGet上)可以将a暴露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); 
}
Run Code Online (Sandbox Code Playgroud)

现在这是列表中的直接读者:没有重复所有内容.