2009-09-06 3 views
3

J'ai deux tables dans une base de données avec des schémas très similaires qui doivent être interrogés de manière similaire. J'ai créé une classe partielle pour les entités linq, puis ai rendu les classes implémentent une interface, IEvent qui définit toutes les propriétés avec les signatures correspondantes dont j'ai besoin. Tout est bon avec ça, je peux partager mes résultats avec IQueryable et utiliser le même code pour travailler sur des données de plus d'une source. Ce que je n'arrive pas à comprendre est une façon sympa d'obtenir la Table en fonction de ce que "DataSource" est en train de faire, donc j'ai cette commande qui devra être mise à jour si une autre source de données est ajoutée. Je l'aime un peu. Tout le monde a des idées intelligentes, il est en retard ici et mon cerveau ne parvient pas ...: -SDynamic Linq.Table <TEntity> possible?

Le code ressemble à ceci:

private IQueryable<IEvent> getEvents(IEnumerable<int> IDs) 
     { 
      var db = new EventDataContext(); 
      // activeDataSource is an enum defined elsewhere 
      switch (activeDataSource) 
      { 
       case DataSource.Source1: 
        return db.Events1.Where(e => IDs.Contains(e.ID)).Cast<IEvent>(); 
        break; 
       case DataSource.Source2: 
        return db.Events2.Where(e => IDs.Contains(e.ID)).Cast<IEvent>(); 
        break; 
      } 
     } 

Répondre

4

je suggère faire générique et en utilisant la méthode DataContext.GetTable():

private IQueryable<IEvent> getEvents<T>(IEnumerable<int> IDs) 
    where T : class, IEvent 
{ 
    var db = new EventDataContext(); 
    return db.GetTable<T>.Where(e => IDs.Contains(e.ID)).Cast<IEvent>(); 
} 
+0

Salut, ça avait l'air juste ce que je cherchais, mais quand j'ai essayé de l'appliquer j'ai eu l'erreur suivante dans VS « T doit être un type de référence afin de l'utiliser comme un paramètre « TEntity » » . Contraindre à une classe comme Event1 fonctionne, mais ce genre de défait le but. :( – withakay

+0

J'ai ajouté une contrainte de classe à T. Cela signifie que T peut être n'importe quelle classe qui implémente IEvent – jrummell

+0

Salut, merci de prendre le temps de répondre, tout cela est très pratique à connaître et à proprement parler vous avez répondu à ma question donc je vais vous donner du crédit, il me reste le problème de décider ce que T devrait être en premier lieu, disons que je veux tirer le DataSource d'un fichier de configuration, je l'évitais, mais je pense que la réflexion pourrait – withakay