LINQ contro due diversi contesti di dati utilizzando le interfacce

Questa è la continuazione della mia domanda posta qui .

Breve riassunto: Ho due database diversi con modifiche minime (una tabella e le chiavi esterne mancano in una tabella) e voglio che la mia utility di importazione che usa Linq-To-Sql sia in grado di popolare entrambi i database con i dati senza duplicare di la logica.

Il mio primo approccio è stato quello di utilizzare dynamic memorizzazione dynamic due diversi contesti di database in una singola variabile, ma questo approccio non ha funzionato e mi è stato consigliato di utilizzare le interfacce per questo scopo.

Ora ho incontrato il seguente problema:

Ho estratto correttamente le interfacce dalla mia class di contesto db:

 public interface IDataContext { System.Data.Linq.Table FieldCollections { get; } System.Data.Linq.Table Fields { get; } } 

… ma per poter implementare l’interfaccia con due diverse classi di contesto del database ho dovuto sostituire anche le attuali classi LINQ ( FieldCollection , Field ) con le interfacce.

Ora ho problemi con la restituzione di Table o Table nella mia implementazione di class. Il codice generato automaticamente per la class di contesto db è il seguente:

  public System.Data.Linq.Table FieldCollections { get { return this.GetTable(); } } 

Quindi, al fine di implementare IDataContext qui ho bisogno di cambiare il valore di ritorno in Table . Come posso quindi Table nella Table nel mio getter della proprietà senza recuperare la tabella completa dal database ?

Nel mio testapp sembra funzionare.

Definisci la tua interfaccia in questo modo:

 public interface IDataContext { IQueryable FieldCollections { get; } IQueryable Fields { get; } } 

Aggiorna i tuoi dati con la seguente implementazione:

 public partial class DataContext1: IDataContext { IQueryable IDataContext.FieldCollections { get { return FieldCollections; } } IQueryable IDataContext.Fields { get { return Fields; } } } 

Ora, se si .Where(

).FirstOrDefault() una query ad esempio, utilizzando .Where().FirstOrDefault() la query viene compilata correttamente, con un WHERE corrispondente in SQL.

 using (IDataContext context = MyDataContextFactory.GetInstance() /* or something else */) { var fieldsCount = context.Fields.Where(x => x.Id == 1).Count(); // The predicate Id == 1 and Count() are translated to sql }