2016-05-24 2 views
3

Ich möchte eine generische Methode zum Lesen aller Daten für jede Tabelle in meinem SQL-Server mit EntityFramework und exportieren Sie diese Daten in MongoDB mit MongoDB C# Treiber. HierGenerische Methode zum Lesen von Daten aus SQL-Tabelle und Export nach MongoDB mit C# -Treiber

ist, was ich

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

zu tun versuche Wie kann ich dies zu erreichen, so dass ich nicht diese Schritte für jede Tabelle zu wiederholen.

Alle meine Tabellen heißen Imp{Id} und ich habe ID list in project Variable, also habe ich Liste der Tabellennamen.

Ich bin mit C# .NET 4.6.1, Entity Framework 6.0, MongoDB C# Treiber 3.0

Dank @CodeCaster ist hier der volle Arbeits Code, wenn jemand nach ähnlicher Hilfe suchen.


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

Also mit "das" meinst du context. {EntityType} .ToList(); 'und' _mongoConnect.Database.GetCollection '? 'DbContext.Set ()' und einige Überlegungen könnten helfen. – CodeCaster

+0

@CodeCaster Ich bin dir nicht gefolgt. War das eine Frage oder ein Kommentar? Ich möchte in der Lage sein, einen Lesevorgang mit Kontext zu machen. .ToList(); und machen Sie dasselbe mit _mongoConnect.Database.GetCollection HaBo

Antwort

1

DbContext hat eine Set<T>() Methode, die Ihnen die DbSet der angeforderten Entitätstyp zurückgibt.

Also, wenn Sie diesen Code in einer generischen Methode setzen:

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

Dann Sie diese Methode für jede Ihrer Imp... Arten mit Reflexion nennen können, finden Sie How do I use reflection to call a generic method?.

So verwenden Sie es wie folgt aus:

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

Sie müssen es so tun, weil Sie nicht direkt Variablen als generische Argumente verwenden können.

Verwandte Themen