for 루프없이 List에서 DataTable을 만드는 가장 빠른 방법

c# datacontext linq linqdatasource sqlbulkcopy

문제

SqlBulkcopy 를 위해 DataTable 로 변환해야하는 거대한 목록 (예 : 100,000 )이 있습니다.

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;
}

수락 된 답변

가장 빠른 방법은 다음과 같습니다.

SqlBulkCopyIDataReader 사용할 수 있습니다. "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); 
}

이것은 이제 목록에 대한 직접적인 독자가되었습니다 : 모든 내용의 중복이 없습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.