Comment utiliser FastMember pour créer le lecteur d'un objet avec un objet enfant

c# fastmember idatareader sqlbulkcopy

Question

Nous avons besoin de SQLBulkCopy une collection que nous avons. Et comme nous avons besoin d’un IDataReader pour utiliser SQLBulkCopy, j’ai essayé d’utiliser FastMember pour cela. Si je comprends bien, nous pouvons utiliser FastMember pour créer un IDataReader partir d’un IEnumerable.

Donc, mon code lit-

using (var reader = ObjectReader.Create(customer.Records)
{
    DataAccess.BulkInsert(serverName, databaseName, tableName, reader);
}

Mais le problème est que chaque enregistrement a un objet enfant appelé qui a des propriétés supplémentaires que je veux avoir dans le lecteur de données pour pouvoir être inséré dans la table dans la base de données. Mais impossible de trouver un moyen d'obtenir un IDataReader plat

Réponse acceptée

J'ai résolu ce problème en créant un anonymous object et en le remplissant avec les valeurs dont nous avions besoin. De cette façon, vous pouvez aplatir votre objet et utiliser uniquement les propriétés dont vous avez besoin.

var newObjects = customer.Records.Select(record => new
{
    customer.Id,
    record.DisplayName,
    record.TotalCount,
    record.Conditions.IsActive,
    record.Conditions.SusperCondition.IsSuper,
    Status = (int)record.Status
});

Ensuite, passez simplement ce nouvel objet à ObjectReader

using (var reader = ObjectReader.Create(newObjects))
{
    DataAccess.BulkInsert(serverName, databaseName, tableName, reader, SetBulkCopyMappings);
}

Insert en vrac -

internal static void BulkInsert(string serverName, string databaseName, string tableName, IDataReader dataReader, Action<SqlBulkCopy> setMappings)
    {
        using (var bulkCopy = new SqlBulkCopy(BuildConnectionString(serverName, databaseName)))
        {
            bulkCopy.DestinationTableName = tableName;
            setMappings(bulkCopy);
            bulkCopy.WriteToServer(dataReader);
        }
    }


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