2016-05-24 8 views
3

EntityFrameworkを使用してSQL Serverの各テーブルのすべてのデータを読み込み、MongoDB C#を使用してそのデータをMongoDBにエクスポートする一般的な方法を考えます。ドライバ。ここでC#を使用してSQLテーブルからデータを読み込んでMongoDBにエクスポートする一般的な方法

は私が各テーブルに対してこれらの手順を繰り返す必要がないように、私は、これを実現するにはどうすればよい

using (MyEntities context = new MyEntities()) 
      { 
       var projects = context.Projects.ToList(); 
       foreach (var project in projects) 
       { 
        var entityType = Type.GetType($"NameSpace.Imp{project.Id}", false); 
        var entityTypeResults = context.{entityType}.ToList(); 
        var entityTypeMongoCollection = _mongoConnect.Database.GetCollection<entityType>("MyCollectionName"); 
        entityTypeMongoCollection.InsertMany(entityTypeResults); 
       } 
      } 

をやろうとしていますものです。

すべて私のテーブルの名前はImp{Id}で、ID listprojectです。テーブル名のリストがあります。私はC#の.NET 4.6.1を使用しています

誰かが同様の助けを探している場合は、Entity Frameworkの6.0、MongoDBのC#のドライバーここ@CodeCaster、に3.0

おかげで、完全な作業コードです。


public void ExporAll() 
     { 
      MethodInfo openMethod = typeof(MyCurrentClassName).GetMethod("CopyEntitiesToMongo"); 
      using (MyEntities context = new MyEntities()) 
      { 
       var projects = context.Projects.ToList(); 
       Assembly assembly = Assembly.Load("NameSpace"); 
       foreach (var project in projects) 
       { 
        var entityType = assembly.GetType($"NameSpace.Imp{project.Id}", false); 
        MethodInfo boundGenericMethod = openMethod.MakeGenericMethod(entityType); 
        if (_mongoConnect?.Database != null) 
         boundGenericMethod.Invoke(this, new object []{context, _mongoConnect.Database, "MyCollectionName"}); 
       } 
      } 
     } 


     public void CopyEntitiesToMongo<TEntity>(DbContext context, 
             IMongoDatabase mongoDatabase, 
             string collectionName) where TEntity : class 
     { 
      if (context != null) 
      { 
       var entityTypeResults = context.Set<TEntity>().ToList(); 
       var entityTypeMongoCollection = mongoDatabase.GetCollection<TEntity>(collectionName); 
       entityTypeMongoCollection.InsertMany(entityTypeResults); 
      } 
     } 
+0

"this"は、 'context. {entityType} .ToList();'と '_mongoConnect.Database.GetCollection 'を意味しますか? 'DbContext.Set ()'といくつかの反映が役立つかもしれません。 – CodeCaster

+0

@CodeCaster私はあなたに従わなかった。それは質問かコメントですか?私は文脈を使って読むことができるようにしたいと思っています。 .ToList(); _mongoConnect.Database.GetCollection HaBo

答えて

1

DbContextあなたに要求したエンティティタイプのDbSetを返すSet<T>()方法があります。

ですから、一般的な方法でそのコードを置く場合:

public void CopyEntitiesToMongo<TEntity>(DbContext entityFrameworkContext, 
             MongoDatabase mongoDatabase, 
             string collectionName) 
    where TEntity : class 
{ 
    var entityTypeResults = context.Set<TEntity>().ToList(); 
    var entityTypeMongoCollection = mongoDatabase.GetCollection<TEntity>(collectionName); 
    entityTypeMongoCollection.InsertMany(entityTypeResults); 
} 

は、その後、あなたがリフレクションを使用してImp...種類ごとにそのメソッドを呼び出すことができ、How do I use reflection to call a generic method?を参照してください。

だから、このようにそれを使用します。

MethodInfo openMethod = typeof(ClassContainingTheAboveMethod).GetMethod("CopyEntitiesToMongo"); 

using (MyEntities context = new MyEntities()) 
{ 
    var projects = context.Projects.ToList(); 
    foreach (var project in projects) 
    { 
     var entityType = Type.GetType($"NameSpace.Imp{project.Id}", false); 
     MethodInfo boundGenericMethod = openMethod.MakeGenericMethod(entityType); 

     boundGenericMethod.Invoke(this, new object[] { context, _mongoConnect.Database, "Tickets" }); 
    } 
} 

あなたが直接ジェネリック引数として変数を使用することはできませんので、あなたは、このようにそれを行う必要があります。

関連する問題