NPoco (ein .NET-Mikro-ORM, abgeleitet von PetaPoco) verfügt über eine Methode zum Masseneinfügen von Datensätzen in eine Datenbank mit einer Liste eines generischen Typs . Die Methodensignatur ist:Aufruf von InsertBulk <T> (IEnumerable <T> pocos) aber nur zur Laufzeit bekannt
void InsertBulk<T>(IEnumerable<T> pocos);
Intern nimmt es den Namen des Typs T und verwendet es die DB-Tabelle, um zu bestimmen einzufügen in (in ähnlicher Weise die Eigenschaftsnamen des Typs sind mit den Spaltennamen abgebildet). Daher ist es von entscheidender Bedeutung, dass eine Variable vom richtigen Typ an die Methode übergeben wird.
Meine Herausforderung ist dies:
- ich gegeben wird eine Liste der Objekte in die DB einzufügen, wie
List<IDataItem>
wo IDataItem ist eine Schnittstelle, die alle einsetzbaren Objekte Klassen - Die Liste implementieren muss, kann enthalten Objekte jeglicher Art, die IDataItem, und es kann eine Mischung von Typen in der Liste
- um das Problem zu unterstreichen implementiert - ich weiß nicht, zum Zeitpunkt der Kompilierung des tatsächlichen konkreten Typen, ich muß passieren zu InsertBulk
Ich habe den folgenden Ansatz versucht, aber das Ergebnis von Convert.ChangeType ist Objekt, also übergebe ich eine Liste von Objekten an InsertBulk, die ungültig ist.
private static Exception SaveDataItemsToDatabase(List<IDataItem> dtos)
{
using (var db = new DbConnection())
{
try
{
var dtosByType = dtos.GroupBy(x => x.GetType());
db.Data.BeginTransaction();
foreach (var dataType in dtosByType)
{
var type = dataType.Key;
var dtosOfType = dataType.Select(x => Convert.ChangeType(x, type));
db.Data.InsertBulk(dtosOfType);
}
db.Data.CommitTransaction();
return null;
}
catch (Exception ex)
{
db.Data.RollbackTransaction();
return ex;
}
}
}
Gibt es eine Möglichkeit, dies zu erreichen?
haben Sie versucht, mit 'dynamic' Stichwort? –
Wenn ich dtosOfType als dynamisch deklariere, bekomme ich das gleiche Ergebnis - die an BulkInsert übergebene Variable ist eine Liste von Object. – Laurence
Haben Sie versucht, Reflection zu verwenden? Verwenden Sie 'Type.GetMethod()', um die Methodendefinition zu erhalten, und verwenden Sie 'MethodInfo.Invoke()' mit den entsprechenden 'System.Type's? – Adwaenyth