NPoco (PetaPoco から派生した .NET マイクロ ORM) には、ジェネリック型のリストを指定して、レコードをデータベースに一括挿入する方法があります。メソッドのシグネチャは次のとおりです。
void InsertBulk<T>(IEnumerable<T> pocos);
内部的には型 T の名前を取り、それを使用して挿入先の DB テーブルを決定します (同様に、型のプロパティ名は列名にマップされます)。したがって、正しい型の変数がメソッドに渡されることが非常に重要です。
私の課題はこれです:
List<IDataItem>
IDataItem はすべての挿入可能なオブジェクトのクラスが実装する必要があるインターフェイスであるため、DB に挿入するオブジェクトのリストが与えられます。- リストには、IDataItem を実装する任意のタイプのオブジェクトを含めることができ、リストにはタイプが混在している可能性があります。
- 問題を強調するために - InsertBulk に渡さなければならない実際の具象型をコンパイル時に知りません
私は次のアプローチを試みましたが、Convert.ChangeType の結果はオブジェクトであるため、オブジェクトのリストを InsertBulk に渡していますが、これは無効です。
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;
}
}
}
これを達成する方法はありますか?