Le moyen le plus rapide de créer DataTable à partir d'une liste sans boucle for

c# datacontext linq linqdatasource sqlbulkcopy

Question

Nous avons une liste énorme (disons 100 000 ) qui doit être convertie en DataTable pour SqlBulkcopy .

Pouvez-vous indiquer ce qui pourrait être le moyen le plus rapide de le faire sans utiliser for for loop? Pour le moment, nous le faisons comme ci-dessous: code listDos est une liste d'objets

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

Réponse acceptée

Le moyen le plus rapide serait: ne pas.

SqlBulkCopy peut prendre un IDataReader . "FastMember" (sur NuGet) peut exposer une List<T> en tant 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); 
}

C'est maintenant un lecteur direct sur la liste: pas de duplication de tout le contenu.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi